您的位置:首页 > 编程语言

Windows编程笔记小结

2010-07-21 16:35 239 查看
1、获取设备描述表的两种方法:

第一种针对WM_PAINT消息,用BeginPaint(hwnd,&ps),EndPaint(hwnd,&ps)来实现,BeginPaint(hwnd,&ps)返回的值是设备描述表句柄,这一返回值通常保存在HDC的类型变量中;

第二种是针对键盘消息或者鼠标消息进行处理的,主要是用GetDC(整个客户去)来获取句柄,或者GetWindowDC。

至于设备描述表的用途,那是所有GDI函数都要用到,所以很重要,BeginPaint(hwnd,&ps)会使客户区有效,而GetDC不会。

2、MM_TEXT坐标系与Windows在PAINTSTRUCT结构中定义无效矩阵时使用的坐标系相同,这为我们带来了很多方便,在MM_TEXT映射方式下,逻辑单位与物理单位相同,都是相对于客户区左上角的像素数,x的值从左向右递增,y的值从上往下递增。

3、可以用GetSystemMetrics函数来确定关于用户界面构件大小的信息,调用GetextMetrics来确定字体的大小。(文本结构TEXTMETRICS)

4、在窗口大小改变时,windows会给窗口过程发送一个WM_SIZE消息,其中lParam地位字包含了客户区的宽度,高位字中包含了客户区的高度,最好定义两个静态变量保存这些信息,static int cxClient,cyClient.cx = LOWORD(lParam),cy = HOWORD(lParam)

5、CS_HERDRAW|CS_VREDRAW告诉Windows,如果水平或者垂直大小发生改变,则强行刷新客户区。

6、对于滚动条信息WM_VSCROLL和WM_HSCROLL,对于来自作为窗口的一部分而创建的滚动条消息,可以忽略lParam,它只用于作为子窗口而创建的滚动条,Wparam消息参数被分为一个低字节和一个高字节,其低位字是一个数值,它指出了鼠标对滚动条进行的操作,通常以SB(scroll bar)开头。

7.获取设备能力GetDeviceCaps(hdc,.....); 对于设备描述表的属性值,Pen,Brush,Font,Bitmap,修改这些值和获取这些值的函数是一样的,都是SelectObject,其他属性都是Set与Get对应,如对于Text Color,修改该值的函数是SetTextColor(),获取该值的函数是GetTextColor()。

8、为了在释放设备描述表之后,仍然保存程序中对设备描述表属性所做的改变,以便在下一次调用GetDC和BeginPaint()时仍然能够起作用,为此,可以在登录窗口类时,将CS_OWNDC标志包含为类的一部分,如:wndclass.style = CS_HREDRAW |CS_VREDRAW|CS_OWNDC,对于用这个窗口类所创建的每个窗口都将用用自己的设备描述表,它一直存在,直到窗口被删除。,另外,CS_OWNDC不影响其他获得的设备描述表。

9、使用GetStockObject可以获得现有画笔的句柄,加入你想使用WHITE_PEN,可以使用HPEN hPen,hPen = GetStockObject(WHITE_PEN);然后将画笔选进设备描述表,SelectObject(hdc,hPen),这两句可以结合在一起SelectObject(hdc,GetStockObject(WHITE_PEN)), SelectObject的返回值是此调用前设备描述表中的画笔句柄,如果设备描述表中的当前画笔是WHITE_PEN,变量hPen将会是BLACK_PEN的句柄,以后通过调用SelectObject(hdc,hPen)能够将BLACK_PEN选进设备描述表。

10、六种GDI对象:刷子,画笔,位图,区域,字体和调色板,除了调色板,这些对象都是铜鼓乖哦SelectObject选进设备描述表的,删除对象时用的是DeleteObject(GDI对象句柄)。

11、Windows对所有消息(WM_MOVE,WM_SIZE,WM_MOUSEMOVE),对所有非GDI函数,甚至是对一些GDI函数,永远使用设备坐标,映射方式作为设备描述表的一种属性,只对GDI对象函数有效。至于那些映射方式,自己感觉暂且用不着,不钻了。

12、PeekMessage(&msg,NULL,0,0,PM_REMOVE),与GetMessage()相同的是,前四个参数都一样,如果将二、三、四参数设置为NULL或0时,表面让PeekMessage返回程序中所以窗口的所有信息(WM_PAITNT消息删不掉的,这点非常重要),如果要将消息从消息队列中删除,将PeekMessage的最后一个参数设置为PM_REMOVE,如果不希望删除,则设置为PM_NOREMOVE,所有PeekMessage是“偷看”而不是“获取”消息,它可以检测程序中的队列中的下一个消息而不是实际删除它。GetMessage不将控制返回给程序,直到从程序的消息队列中获取消息,但是PeekMessage总是立刻返回,而不论一个消息是否出现,当消息队列中有一个消息时,PeekMessage的返回值为TRUE,否则为False。GetMessage在检测到WM_QUIT时,将返回为0,而PeekMessage对于WM_QUIT的检测是显示的,返回为TRUE,与其他消息一样进行处理。可以利用PeekMessage对处理消息空闲时间进行我们自己要进行的处理。

13、从队列中删除WM_PAINT消息的唯一方法是令窗口客户区的失效区域变为有效,这可以用ValidateRect和ValidateRgn或者BeginPaint和EndPaint对来完成。

14、SetRect(&Rect,left,top,right,bottom);区域是对显示器上一个范围的描述,这个范围是矩形、多边形和椭圆的组合。可以通过区域将绘图的范围限制为客户区的一部分。CreateRectRgn、CreateEllipticRgn、CreatePolygonRgn,区域的句柄可以用于4个绘图函数:FillRgn(hdc,hRgn,hBrush)、FramelRgn(hdc,hRgn,hBrush,xFrame,yFrame)、InvertRgn(hdc,hRgn)、PaintRgn(hdc,hRgn).Windows有两个作用与区域而不是矩形的函数,它们类似与InValidateRect和ValidateRect,分别是ValidateRgn和InValidateRgn,这样剪裁区域不一定是矩形,可以使用SelectObject(hcc,hRgn)或者SelectClipRgn(hcc,hRgn)将一个区域选进设备描述表(最后一个属性啦)

暂时写这么多。。。。以后再写后面的键盘鼠标之类的信息。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: