真钱捕鱼Windows程序设计零基础自学_2_Windows程序的显示和更新_之WM_PAINT消息

假使客户区的上升的幅度和中度不能够被5整除,客户区的左边或底层就能够产出三个小长条区域,不被举办覆盖。在此片区域扩充鼠标单击时,CHECKERubicon1程序会调用MessageBeep函数进行响应。

    上面包车型地铁部分函数的原型未有指明重返值类型, 大家可以经过编写翻译景况友好查看, 因为笔者有一点点懒,所以就没查看了。

  4、增加代码,编写翻译运路程序。

具备贰拾三个矩形具备相近的增长幅度和冲天,那个宽度和冲天被保存在cxBlock、cyBlock中。无论何时转移客商区的大小,程序都将重新总计cxBlock、cyBlock。WM_LBUTTONDOWN管理逻辑利用鼠标的坐标来决断哪些矩形被单击,然后在fState数组中运用位运算符(按位异或^)总计这几个矩形的新情状,最后强逼使该矩形失效,进而产生WM_PAINT消息。

    笔者开采用LiveWrite这一个东西相比较好.......

  首先让我们先来驾驭一下画控件的基本原理和进度,大概那么些才是本文的原意。大家都知情Windows中有着可视的东西都以画出来的,那么这几个画画的里边进度又是什么的啊?日常画Windows控件的长河分成三超越一半:一是在WM_MEASUREITEM音信影射函数中装置当前要画的Item的尺寸尺寸;二是在WM_DRAWITEM音讯影射函数中依据Item的大小尺寸来画该Item(Logo/位图/字符串等卡塔尔(قطر‎;三是在WM_PAINT新闻映射函数中每每的绘图当前的控件内容。

当CHECKEHaval1程序收到WM_PAINT消息时,它会重新绘制整个顾客区,利用GDI中的Rectangle函数画出具备的矩形。若fState值为真,则CHECKEENCORE1程序调用函数MoveToEx和函数LineTo函数画出两条直线。

     后边的风华正茂篇作品里面,笔者模仿这本杰出的书写了一个windows程序, 对windows的主次设计有了一丝丝的感到认知, 可是对于程序的安顿还是一知半解,由此要求后续自学, 接着看那本精湛的书......

深信读者朋友们对OFFICE二零零二决然非常纯熟吧,它里面的东东可真不菲,不管是天真烂缦的"大眼夹",依然种种平面造型的Windows控件都深受广大客商喜好。那么这一次就让大家来模拟它做个可怜常用的控件:"颜色组合框"。要是您现在正值做关于字管理类的软件时那些"东东"一定对你有用。程序编写翻译运营后的分界面效果如图风华正茂所示:

CHECKE翼虎1程序展现结果如图所示:

        3、固然程序呼叫InvalidateRect使呈现区域中的矩形失效,则InvalidateRect函数的最后一个参数会钦点是还是不是擦除背景。借使这些参数为FALSE
           则windows不会擦除背景,并且在呼唤完BeginPaint后将置 ps.f伊Russe=TRUE 非零。
           在处理WM_PAINT音信时,尽管急需在低效区域外实行重绘,能够呼叫InvalidateRect函数:
            Exp:
                 InvalidateRect(hwnd,NULL,TRUE);
            在BeginPaint函数此前呼叫InvalidateRect函数使全部展现区域改为无效,并擦除背景;但如果最后三个参数等于FALSE,则不会擦除背景,窗口
            中本来的音信还保存在原处。
        4、RECT rcPaint 是三个RECT型的布局体, PAINTSTRUCT布局中的rcPaint成员定义了没用区域的界限。

CHECKER1.C

     下边是自家的一点总计吧,贴出来让各位壮士看看,希望英豪们请教, 建议自个儿认知中的不当之处,以帮扶小编在自学的历程中拉长.......

  真钱捕鱼Windows程序设计零基础自学_2_Windows程序的显示和更新_之WM_PAINT消息。二、编制程序步骤

CHECKE大切诺基1程序将顾客细分分为贰拾八个矩形,构成一个5*5的数组。要是在里边三个矩形内单击鼠标,就用X形填充该矩形。再一次单击,则X形消失。

前方的内容简短的陈诉了利用BeginPaint和EndPaint函数来管理WM_PAINT消息的建制,精晓不成功之处请各位见谅。

  最终一步正是何许来画的标题了,说白了就是什么分配每一个成分的上空,怎么着在它们各自的上空上画出你想要的事物。根据正规平日分别总结出ICON所占的矩形区域/文本所占的矩形区域/位图的矩形区域,纵然您还应该有其余因素那么也应当总计出该因素所占的矩形区域/位图所占的矩形区域。接下来的全体都很简短了,不外乎CDC类的多少个常用函数:画图标用DrawIcon()、画位图用BitBlt()、画文字用DrawText()等函数。如果你以为视觉上还非常不足老董L,你还足以来设置各样Item的文件颜色,背景颜色,以至Logo的勃兴和凹陷的视觉效果。

  1 /*--------------------------------------------
  2 CHECKER1.C -- Mouse Hit-Test Demo Program No.1
  3               (c) Charles Petzold, 1998
  4 --------------------------------------------*/
  5 
  6 #include <Windows.h>
  7 
  8 #define DIVISION 5
  9 
 10 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 11 
 12 int WINAPI WinMain( __in HINSTANCE hInstance
 13                     , __in_opt HINSTANCE hPrevInstance
 14                     , __in LPSTR lpCmdLine
 15                     , __in int nShowCmd )
 16 {
 17     static TCHAR szAppName[] = TEXT("Checker1");
 18     HWND hwnd;
 19     MSG msg;
 20     WNDCLASS wndclass;
 21 
 22     wndclass.style = CS_HREDRAW | CS_VREDRAW;
 23     wndclass.lpfnWndProc = WndProc;
 24     wndclass.cbClsExtra = 0;
 25     wndclass.cbWndExtra = 0;
 26     wndclass.hInstance = hInstance;
 27     wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
 28     wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
 29     wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
 30     wndclass.lpszMenuName = NULL;
 31     wndclass.lpszClassName = szAppName;
 32 
 33     if (!RegisterClass(&wndclass))
 34     {
 35         MessageBox(NULL, TEXT("Program requires Windows NT!")
 36             , szAppName, MB_ICONERROR);
 37         return 0;
 38     }
 39 
 40     hwnd = CreateWindow(szAppName, TEXT("Checker1 Mouse Hit-Test Demo")
 41         , WS_OVERLAPPEDWINDOW
 42         , CW_USEDEFAULT, CW_USEDEFAULT
 43         , CW_USEDEFAULT, CW_USEDEFAULT
 44         , NULL, NULL, hInstance, NULL);
 45 
 46     ShowWindow(hwnd, nShowCmd);
 47     UpdateWindow(hwnd);
 48 
 49     while (GetMessage(&msg, NULL, 0, 0))
 50     {
 51         TranslateMessage(&msg);
 52         DispatchMessage(&msg);
 53     }
 54 
 55     return msg.wParam;
 56 }
 57 
 58 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 59 {
 60     static BOOL fState[DIVISION][DIVISION];
 61     static int cxBlock, cyBlock;
 62     HDC hdc;
 63     int x, y;
 64     PAINTSTRUCT ps;
 65     RECT rect;
 66 
 67     switch (message)
 68     {
 69     case WM_SIZE:
 70         cxBlock = LOWORD(lParam) / DIVISION;
 71         cyBlock = HIWORD(lParam) / DIVISION;
 72         return 0;
 73 
 74     case WM_LBUTTONDOWN:
 75         x = LOWORD(lParam) / cxBlock;
 76         y = HIWORD(lParam) / cyBlock;
 77 
 78         if (x < DIVISION && y < DIVISION)
 79         {
 80             fState[x][y] ^= 1;
 81 
 82             rect.left = x * cxBlock;
 83             rect.top = y * cyBlock;
 84             rect.right = (x + 1) * cxBlock;
 85             rect.bottom = (y + 1) * cyBlock;
 86 
 87             InvalidateRect(hwnd, &rect, FALSE);
 88         }
 89         else
 90             MessageBeep(0);
 91         return 0;
 92 
 93     case WM_PAINT:
 94         hdc = BeginPaint(hwnd, &ps);
 95 
 96         for (x = 0; x < DIVISION; ++x)
 97             for (y = 0; y < DIVISION; ++y)
 98             {
 99                 Rectangle(hdc, x * cxBlock, y * cyBlock
100                     , (x + 1) * cxBlock, (y + 1) * cyBlock);
101 
102                 if (fState[x][y])
103                 {
104                     MoveToEx(hdc, x * cxBlock, y * cyBlock, NULL);
105                     LineTo(hdc, (x + 1) * cxBlock, (y + 1) * cyBlock);
106                     MoveToEx(hdc, x * cxBlock, (y + 1) * cyBlock, NULL);
107                     LineTo(hdc, (x + 1) * cxBlock, y * cyBlock);
108                 }
109             }
110 
111         EndPaint(hwnd, &ps);
112         return 0;
113 
114     case WM_DESTROY:
115         PostQuitMessage(0);
116         return 0;
117     }
118 
119     return DefWindowProc(hwnd, message, wParam, lParam);
120 }

4.1   展现和立异
windows应用程序的呈现区域:
       除标题栏、应用程序边框、菜单栏、工具栏、滚动条和状态条外的系统一分配配给应用程序的窗口区域。
Windows显示文字和图表的方法:
       1、通过绘制应用程序的来得区域来兑现
       2、当应用程序的一些部分被覆盖后,windows不会保留被遮住的区域,当程序移开后,windows通过发送消息文告
            应用程序须求再行绘制被遮掩的区域来兑现显示
       3、windows通过发送WM_PAINT新闻来打招呼应用程序的窗口新闻管理程序,必要再度绘制彰显区域
4.2  WM_PAINT消息:
  WM_PAINT新闻的发出机会:
       1、在调用UpdateWindow函数时,windows会像应用程序发送多个WM_PAINT音讯,公告应用程序要求重绘展现区域。
       2、在应用程序的使用者移动窗口时,窗口中先前被埋伏的区域重新可以看到
       3、使用者退换窗口的朗朗上口,同一时间wndclass.style 中设定了CS_VREDRAW 和CS_HREDRAW
       4、程序中调用ScrollWindow或ScrollDC函数滚动彰显区域的风流倜傥有的
       5、程序中央银行使InvalidateRect或Invalidate瑞虎gn函数发生WM_PAINT消息

  3、在前后相继的对话框中放置八个ComboBox控件,使用CLASSWIZAEscortD增多相应的CComboBox类成员变量,然后将该成员变量的档次改革为CBSColorComboBox;

返回列表