ReleaseDC为什么要求指定窗口句柄?

[复制链接]
查看11 | 回复10 | 2021-1-27 05:22:46 | 显示全部楼层 |阅读模式
说实话,微软设计的这个函数我没看懂!
intReleaseDC(HWNDhWnd,HDChdc);
不是已经有hdc了,为什么还要指定hWnd?
WINGDIAPIBOOLWINAPIMoveToEx(
HDChdc,
intX,
intY,
LPPOINTlpPoint
);
MoveToEx()为什么就不用指定hWnd?
哪位同学能解答一下,谢了!
分 -->
回复

使用道具 举报

千问 | 2021-1-27 05:22:46 | 显示全部楼层
可能看一下ReleaseDC函数的源代码就知道
回复

使用道具 举报

千问 | 2021-1-27 05:22:46 | 显示全部楼层
一个窗口一个DC
intReleaseDC(HWNDhWnd,HDChdc);要知道那个窗口的DC
窗口类的
CWnd::ReleaseDC
intReleaseDC(CDC*pDC);
全局的
ReleaseDC
TheReleaseDCfunctionreleasesadevicecontext(DC),freeingitforusebyotherapplications.TheeffectoftheReleaseDCfunctiondependsonthetypeofdevicecontext.Itfreesonlycommonandwindowdevicecontexts.Ithasnoeffectonclassorprivatedevicecontexts.
intReleaseDC(
HWNDhWnd,//handletowindow
HDChDC//handletodevicecontext
);


回复

使用道具 举报

千问 | 2021-1-27 05:22:46 | 显示全部楼层
每个窗口都有自己的绘图设备DC,你要释放主框口还是子窗口的DC?所有得有窗口句柄。至于你说的MOVE函数,你写在那个窗口它就是在这个窗口中移动点的坐标,所以不需要指定窗口句柄。
回复

使用道具 举报

千问 | 2021-1-27 05:22:46 | 显示全部楼层
MoveToEx是个全局API需要一个hdc(这个hdc要先得到)
GetDC
TheGetDCfunctionretrievesahandletoadisplaydevicecontextfortheclientareaofaspecifiedwindoworfortheentirescreen.YoucanusethereturnedhandleinsubsequentGDIfunctionstodrawinthedevicecontext.
TheGetDCExfunctionisanextensiontoGetDC,whichgivesanapplicationmorecontroloverhowandwhetherclippingoccursintheclientarea.
HDCGetDC(
HWNDhWnd//handletoawindow
);
有了dc就可以绘制了,即绘制是在DC上进行的
TheMoveToExfunctionupdatesthecurrentpositiontothespecifiedpointandoptionallyreturnsthepreviousposition.
BOOLMoveToEx(
HDChdc,//handletodevicecontext
intX,//x-coordinateofnewcurrentposition
intY,//y-coordinateofnewcurrentposition
LPPOINTlpPoint//pointertooldcurrentposition
);

回复

使用道具 举报

千问 | 2021-1-27 05:22:46 | 显示全部楼层
hDC是与hWnd相关的,很可能通过hDC无法直接得到其对应的hWnd的。
 (因为这二者都是“HANDLE”这种数据类型的内核对象,其“信息结构”是等同的吧)
因此,如果你不给出对应的hWnd的话,
 那么在函数内部,岂不是要在“一片茫茫大海的hWnd”中,去找一下这个hDC属于哪个hWnd?
 这样“运行效率”会不会太低了…………
所以,函数要求直接给出对应的hWnd。



PS:
 以上内容,
 纯属臆测。
 如有失误,
 请勿见怪。


回复

使用道具 举报

千问 | 2021-1-27 05:22:46 | 显示全部楼层
微软有许多接口设计的是不合理,这是历史原因。
微软对用户友好,但是对程序员是很不友好的
回复

使用道具 举报

千问 | 2021-1-27 05:22:46 | 显示全部楼层
按照你们的说法,MoveToEx()也应该指定hWnd,否则GDI函数就不知道应该在哪个窗口上绘图?
但是,GDI函数只要指定HDC就可以了!为什么呢?因为你检索HDC的时候就已经传入了HWND参数。
奇怪的是释放HDC的时候,ReleaseDC()为什么要求指定hWnd?
微软肯定不会多加一个参数,这其中必然有他的道理?
回复

使用道具 举报

千问 | 2021-1-27 05:22:46 | 显示全部楼层
GDI绘图,是只管操作相应的hDC,不会去管窗口的,好不好!
 有相应的hDC了,它就可以知道该去操作哪块“内存数据区”,
 此时用得着去理会“窗口”吗?
它的“绘图结果”要显示出来,那是“窗口刷新(重绘)”时的事情了……
 这时自然有相应的hWnd来“指导”操作。


回复

使用道具 举报

千问 | 2021-1-27 05:22:46 | 显示全部楼层

ReleaseDC(NULL,hDC);
这句怎么解释?msdn上的原代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行