API之子窗口创建 (转)

子窗口的创建非常非常重要

步骤:1、新建窗口类,在窗口类中指名对应的自定义的窗口过程。窗口类类名要唯一,它     

         是各窗口类相互区别的标识。注意,类名或为静态变量,或为全局变量,因为程

         序随时都用他们。

      2、创建窗体时,指定其风格之一为WS_CHILD, 指定其父窗口句柄,得到父窗体实

         例句柄,并赋给子窗体。

      3、在主窗体的create消息中,创建0尺寸的子窗体,主窗体的size消息中,利用

        movewindow函数,重设窗体大小,重置窗体位置。

实例为CTRL002,CTRL003

实例CTRL001单击按钮显示对应文字

子窗口向父窗口发送消息

CreateWindow呼叫使用下面这些参数:

Class name(类别名称)

Window text(窗口文字)

Window style(窗口样式)

x position(x位置)

y position(y位置)

Width(宽度)

Height(高度)

Parent window(父窗口)

Child window ID(子窗口ID)

Instance handle(执行实体句柄

)Extra parameters(附加参数)

TEXT ("button")

button[i].szText

WS_CHILD|WS_VISIBLE|button[i].iStyle

cxChar

cyChar * (1 + 2 * i)

20 * xChar

7 * cyChar / 4

hwnd

(HMENU)i

((LPCREATESTRUCT) lParam) -> hInstance

NULL

 

 

说明:从WM_COMMAND区别出单击了哪个按钮。通过子窗口的ID号来区分。每个子窗口在创建时,就已经分配了一个唯一的ID号。ID号包含在WM_COMMAND消息中wParam的低字节位。用LOWORD()宏来获取ID。

      “用鼠标单击按钮时,子窗口控制就向其父窗口发送一个WM_COMMAND消息。...捕获WM_COMMAND消息....”

       “LOWORD(wParam)   子窗口ID

         HIWORD(wParam)    通知码

         lParam              子窗口句柄”

 

[cpp] view plaincopyprint?
  1. #include <windows.h>   
  2. int iFlag=1;//记录被单击按钮的ID   
  • //定义一个按钮类型结构体,方便创建按钮,提高代码复用率   
  • struct  
  • {  
  •      int     iStyle ;  
  •      TCHAR * szText ;  
  • }  
  • button[] =  
  • {  
  •      BS_PUSHBUTTON,      TEXT ("PUSHBUTTON"),  
  •      BS_DEFPUSHBUTTON,   TEXT ("DEFPUSHBUTTON"),  
  •      BS_CHECKBOX,        TEXT ("CHECKBOX"),   
  •      BS_AUTOCHECKBOX,    TEXT ("AUTOCHECKBOX"),  
  •      BS_RADIOBUTTON,     TEXT ("RADIOBUTTON"),  
  •      BS_3STATE,          TEXT ("3STATE"),  
  •      BS_AUTO3STATE,      TEXT ("AUTO3STATE"),  
  •      BS_GROUPBOX,        TEXT ("GROUPBOX"),  
  •      BS_AUTORADIOBUTTON, TEXT ("AUTORADIO"),  
  •      BS_OWNERDRAW,       TEXT ("OWNERDRAW")  
  • } ;  
  • #define NUM (sizeof button / sizeof button[0])   
  • LRESULT CALLBACK WndProc (HWNDUINTWPARAMLPARAM) ;  
  • int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,  
  •                     PSTR szCmdLine, int iCmdShow)  
  • {  
  •      static TCHAR szAppName[] = TEXT ("BtnLook") ;  
  •      HWND         hwnd ;  
  •      MSG          msg ;  
  •      WNDCLASS     wndclass ;  
  •        
  •      wndclass.style         = CS_HREDRAW | CS_VREDRAW ;  
  •      wndclass.lpfnWndProc   = WndProc ;  
  •      wndclass.cbClsExtra    = 0 ;  
  •      wndclass.cbWndExtra    = 0 ;  
  •      wndclass.hInstance     = hInstance ;  
  •      wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;  
  •      wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;  
  •      wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;  
  •      wndclass.lpszMenuName  = NULL ;  
  •      wndclass.lpszClassName = szAppName ;  
  •        
  •      if (!RegisterClass (&wndclass))  
  •      {  
  •           MessageBox (NULL, TEXT ("This program requires Windows NT!"),  
  •                       szAppName, MB_ICONERROR) ;  
  •           return 0 ;  
  •      }  
  •        
  •      hwnd = CreateWindow (szAppName, TEXT ("Button Look"),  
  •                           WS_OVERLAPPEDWINDOW,  
  •                           CW_USEDEFAULT, CW_USEDEFAULT,  
  •                           CW_USEDEFAULT, CW_USEDEFAULT,  
  •                           NULL, NULL, hInstance, NULL) ;  
  •        
  •      ShowWindow (hwnd, iCmdShow) ;  
  •      UpdateWindow (hwnd) ;  
  •        
  •      while (GetMessage (&msg, NULL, 0, 0))  
  •      {  
  •           TranslateMessage (&msg) ;  
  •           DispatchMessage (&msg) ;  
  •      }  
  •      return msg.wParam ;  
  • }  
  • LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)  
  • {  
  •      static HWND  hwndButton[NUM] ;//句柄是一个数值,所以可以定义成数组形式   
  •      static int   cxChar, cyChar ;  
  •       
  •      int iLength=0;  
  •      int          i ;  
  •       
  •        
  •      HDC          hdc ;  
  •      PAINTSTRUCT  ps ;  
  •        
  •        
  •      switch (message)  
  •      {  
  •      case WM_CREATE :  
  •           cxChar = LOWORD (GetDialogBaseUnits ()) ;  
  •           cyChar = HIWORD (GetDialogBaseUnits ()) ;  
  •             
  • //得用 button[] ,简化创建一系列按钮过程,这就是编辑的艺术   
  •           for (i = 0 ; i < NUM-1 ; i++)  
  •                hwndButton[i] = CreateWindow ( TEXT("button"),   
  •                                    button[i].szText,  
  •                                    WS_CHILD | WS_VISIBLE | button[i].iStyle,  
  •                                    cxChar, cyChar * (1 + 2 * i),  
  •                                    20 * cxChar, 7 * cyChar / 4,  
  •                                    hwnd, (HMENU) i,  
  •                                    ((LPCREATESTRUCT) lParam)->hInstance, NULL) ;  
  •                                    //((HMENU) i),为子窗口指定唯一的ID号。按钮是子窗口的一种。该参数通常用于指定程序的菜单,因此子窗口ID必须被强制转换为HMENU   
  •       
  •             /* hwndButton[9] = CreateWindow ( TEXT("button"),  
  •                                    button[9].szText, 
  •                                    WS_CHILD | WS_VISIBLE | button[9].iStyle, 
  •                                    cxChar, cyChar * (1 + 2 * 9), 
  •                                    20 * cxChar, 7 * cyChar / 4, 
  •                                    hwnd, (HMENU) 9, 
  •                                    ((LPCREATESTRUCT) lParam)->hInstance, NULL) ; 
  •              *这种按钮,会不断地触发WM_COMMAND消息,不断地调用WM_COMMAND中的InvalidateRect, 
  •               使客户区不断更新,出现闪烁现象。 
  •             */  
  •           return 0 ;  
  •      case WM_PAINT :  
  •           //InvalidateRect (hwnd, &rect, TRUE) ;   
  •             
  •           hdc = BeginPaint (hwnd, &ps) ;  
  •           //为举例方便起见,将窗口ID号数值大小顺序设定成自定义按钮结构体的顺序   
  •           TextOut(hdc,300,200,button[iFlag].szText,lstrlen(button[iFlag].szText));  
  •           EndPaint (hwnd, &ps) ;  
  •           return 0 ;  
  •      case WM_DRAWITEM :  
  •      case WM_COMMAND :  
  •             
  •           hdc = GetDC (hwnd) ;  
  •           //得到子窗口的ID号   
  •           iFlag=LOWORD(wParam);//LOWORD=LOW WORD,HIWORD=HIGH WORD   
  •             
  •           ReleaseDC (hwnd, hdc) ;  
  •           InvalidateRect (hwnd, NULL, TRUE) ;//使客户区失效,发出WM_PAINT消息,导致重绘发生   
  •           return 0;  
  •      case WM_DESTROY :  
  •           PostQuitMessage (0) ;  
  •           return 0 ;  
  •      }  
  •      return DefWindowProc (hwnd, message, wParam, lParam) ;  
  • }  

#include <windows.h> int iFlag=1;//记录被单击按钮的ID //定义一个按钮类型结构体,方便创建按钮,提高代码复用率 struct { int iStyle ; TCHAR * szText ; } button[] = { BS_PUSHBUTTON, TEXT ("PUSHBUTTON"), BS_DEFPUSHBUTTON, TEXT ("DEFPUSHBUTTON"), BS_CHECKBOX, TEXT ("CHECKBOX"), BS_AUTOCHECKBOX, TEXT ("AUTOCHECKBOX"), BS_RADIOBUTTON, TEXT ("RADIOBUTTON"), BS_3STATE, TEXT ("3STATE"), BS_AUTO3STATE, TEXT ("AUTO3STATE"), BS_GROUPBOX, TEXT ("GROUPBOX"), BS_AUTORADIOBUTTON, TEXT ("AUTORADIO"), BS_OWNERDRAW, TEXT ("OWNERDRAW") } ; #define NUM (sizeof button / sizeof button[0]) LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("BtnLook") ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass)) { MessageBox (NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ; return 0 ; } hwnd = CreateWindow (szAppName, TEXT ("Button Look"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL) ; ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static HWND hwndButton[NUM] ;//句柄是一个数值,所以可以定义成数组形式 static int cxChar, cyChar ; int iLength=0; int i ; HDC hdc ; PAINTSTRUCT ps ; switch (message) { case WM_CREATE : cxChar = LOWORD (GetDialogBaseUnits ()) ; cyChar = HIWORD (GetDialogBaseUnits ()) ; //得用 button[] ,简化创建一系列按钮过程,这就是编辑的艺术 for (i = 0 ; i < NUM-1 ; i++) hwndButton[i] = CreateWindow ( TEXT("button"), button[i].szText, WS_CHILD | WS_VISIBLE | button[i].iStyle, cxChar, cyChar * (1 + 2 * i), 20 * cxChar, 7 * cyChar / 4, hwnd, (HMENU) i, ((LPCREATESTRUCT) lParam)->hInstance, NULL) ; //((HMENU) i),为子窗口指定唯一的ID号。按钮是子窗口的一种。该参数通常用于指定程序的菜单,因此子窗口ID必须被强制转换为HMENU /* hwndButton[9] = CreateWindow ( TEXT("button"), button[9].szText, WS_CHILD | WS_VISIBLE | button[9].iStyle, cxChar, cyChar * (1 + 2 * 9), 20 * cxChar, 7 * cyChar / 4, hwnd, (HMENU) 9, ((LPCREATESTRUCT) lParam)->hInstance, NULL) ; *这种按钮,会不断地触发WM_COMMAND消息,不断地调用WM_COMMAND中的InvalidateRect, 使客户区不断更新,出现闪烁现象。 */ return 0 ; case WM_PAINT : //InvalidateRect (hwnd, &rect, TRUE) ; hdc = BeginPaint (hwnd, &ps) ; //为举例方便起见,将窗口ID号数值大小顺序设定成自定义按钮结构体的顺序 TextOut(hdc,300,200,button[iFlag].szText,lstrlen(button[iFlag].szText)); EndPaint (hwnd, &ps) ; return 0 ; case WM_DRAWITEM : case WM_COMMAND : hdc = GetDC (hwnd) ; //得到子窗口的ID号 iFlag=LOWORD(wParam);//LOWORD=LOW WORD,HIWORD=HIGH WORD ReleaseDC (hwnd, hdc) ; InvalidateRect (hwnd, NULL, TRUE) ;//使客户区失效,发出WM_PAINT消息,导致重绘发生 return 0; case WM_DESTROY : PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }

 

 

 

实例CTRL002 利用多个静态窗体绘制棋盘

说明:1、窗体类别必需是static类,否则程序不能生成静态窗体

      2、利用GetWindowLong得到窗体实例句柄

      3、HWND是数值类型,可以定义成数组

      4、创建子窗体时,将大小设为0,以便重置

      4、利用movewidow(...)函数重置静态子窗体位置

 

[cpp] view plaincopyprint?
  1. #include <windows.h>   
  2. LRESULT CALLBACK WndProc (HWNDUINTWPARAMLPARAM) ;  
  3. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,  
  4.                     PSTR szCmdLine, int iCmdShow)  
  5. {  
  6.      static TCHAR szAppName[] = TEXT ("HelloWin") ;  
  7.      HWND         hwnd ;  
  8.      MSG          msg ;  
  9.      WNDCLASS     wndclass ;  
  10.      wndclass.style         = CS_HREDRAW | CS_VREDRAW ;  
  11.      wndclass.lpfnWndProc   = WndProc ;  
  12.      wndclass.cbClsExtra    = 0 ;  
  13.      wndclass.cbWndExtra    = 0 ;  
  14.      wndclass.hInstance     = hInstance ;  
  15.      wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;  
  16.      wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;  
  17.      wndclass.hbrBackground = CreateSolidBrush (0) ;//将背景色设成黑色   
  18.      wndclass.lpszMenuName  = NULL ;  
  19.      wndclass.lpszClassName = szAppName ;  
  20.      if (!RegisterClass (&wndclass))  
  21.      {  
  22.           MessageBox (NULL, TEXT ("This program requires Windows NT!"),   
  23.                       szAppName, MB_ICONERROR) ;  
  24.           return 0 ;  
  25.      }  
  26.      hwnd = CreateWindow (szAppName,                  // window class name   
  27.                           TEXT ("Chess"), // window caption   
  28.                           WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX   
  29.                           & ~WS_THICKFRAME & ~ WS_MINIMIZEBOX    //去除max、minbox,禁止改变窗体大小   
  30.                           ,        // window style   
  31.                           CW_USEDEFAULT,              // initial x position   
  32.                           CW_USEDEFAULT,              // initial y position   
  33.                           CW_USEDEFAULT,              // initial x size   
  34.                           CW_USEDEFAULT,              // initial y size   
  35.                           NULL,                       // parent window handle   
  36.                           NULL,                       // window menu handle   
  37.                           hInstance,                  // program instance handle   
  38.                           NULL) ;                     // creation parameters   
  39.        
  40.      ShowWindow (hwnd, iCmdShow) ;  
  41.      UpdateWindow (hwnd) ;  
  42.        
  43.      while (GetMessage (&msg, NULL, 0, 0))  
  44.      {  
  45.           TranslateMessage (&msg) ;  
  46.           DispatchMessage (&msg) ;  
  47.      }  
  48.      return msg.wParam ;  
  49. }  
  50. LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)  
  51. {  
  52.        
  53.         
  54.      static HWND hwndRect[32];  
  55.       
  56.      HINSTANCE hinstance;  
  57.      int       iw,ik,im,cxClient, cyClient ;//不能将它们定义在switch中   
  58.      switch (message)  
  59.      {  
  60.      case WM_CREATE:  
  61.              
  62.          hinstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);  
  63.          //得到程序的实例   
  64.            
  65.          //窗体类别必需是static类,否则程序不能生成静态窗体。   
  66.          for(iw=0;iw<32;iw++)  
  67.          {  
  68.                  hwndRect[iw]=CreateWindow(TEXT("STATIC"),NULL,  
  69.                                            WS_CHILD|WS_VISIBLE|SS_WHITERECT, //将static 窗体背景色设成白色,好像只能设成黑/白彩色   
  70.                                            0,0,0,0,  
  71.                                            hwnd,(HMENU)iw,  
  72.                                            hinstance,  
  73.                                            NULL  
  74.                                            );  
  75.          }  
  76.           MoveWindow(hwnd,0,0,300,300,TRUE);  
  77.           return 0 ;  
  78.      case WM_SIZE:  
  79.           //MoveWindow(hwnd,0,0,400,400,TRUE);   
  80.           cxClient = LOWORD (lParam) ;//得到客户区宽度   
  81.           cyClient = HIWORD (lParam) ;//得到客户区高度   
  82.             
  83.           //SetRect(&rcColor,icxClient/2,0,icxClient,icyClient);   
  84.           /* 
  85.           //归纳法 
  86.           for(ik=0;ik<4;ik++) 
  87.               //for(im=0;im<4;im++) 
  88.           MoveWindow (hwndRect[ik], (0%2+ik)*cxClient/4, 0, cxClient/8, cyClient/8, TRUE) ; 
  89.           for(ik=0;ik<4;ik++) 
  90.           MoveWindow (hwndRect[ik+4], (1%2)*cxClient/8+ik*cxClient/4, cyClient/8, cxClient/8, cyClient/8, TRUE) ; 
  91.           */  
  92.           MoveWindow(hwnd,200,100,300,300,TRUE);  
  93.           for(ik=0;ik<4;ik++)  
  94.               for(im=0;im<8;im++)  
  95.                   MoveWindow (hwndRect[ik+4*im], (im%2)*cxClient/8+ik*cxClient/4, im*cyClient/8, cxClient/8, cyClient/8, TRUE) ;  
  96.           return 0;  
  97.             
  98.             
  99.      case WM_DESTROY:  
  100.           PostQuitMessage (0) ;  
  101.           return 0 ;  
  102.      }  
  103.      return DefWindowProc (hwnd, message, wParam, lParam) ;  
  104. }  

#include <windows.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("HelloWin") ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = CreateSolidBrush (0) ;//将背景色设成黑色 wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass)) { MessageBox (NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ; return 0 ; } hwnd = CreateWindow (szAppName, // window class name TEXT ("Chess"), // window caption WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX & ~WS_THICKFRAME & ~ WS_MINIMIZEBOX //去除max、minbox,禁止改变窗体大小 , // window style CW_USEDEFAULT, // initial x position CW_USEDEFAULT, // initial y position CW_USEDEFAULT, // initial x size CW_USEDEFAULT, // initial y size NULL, // parent window handle NULL, // window menu handle hInstance, // program instance handle NULL) ; // creation parameters ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static HWND hwndRect[32]; HINSTANCE hinstance; int iw,ik,im,cxClient, cyClient ;//不能将它们定义在switch中 switch (message) { case WM_CREATE: hinstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE); //得到程序的实例 //窗体类别必需是static类,否则程序不能生成静态窗体。 for(iw=0;iw<32;iw++) { hwndRect[iw]=CreateWindow(TEXT("STATIC"),NULL, WS_CHILD|WS_VISIBLE|SS_WHITERECT, //将static 窗体背景色设成白色,好像只能设成黑/白彩色 0,0,0,0, hwnd,(HMENU)iw, hinstance, NULL ); } MoveWindow(hwnd,0,0,300,300,TRUE); return 0 ; case WM_SIZE: //MoveWindow(hwnd,0,0,400,400,TRUE); cxClient = LOWORD (lParam) ;//得到客户区宽度 cyClient = HIWORD (lParam) ;//得到客户区高度 //SetRect(&rcColor,icxClient/2,0,icxClient,icyClient); /* //归纳法 for(ik=0;ik<4;ik++) //for(im=0;im<4;im++) MoveWindow (hwndRect[ik], (0%2+ik)*cxClient/4, 0, cxClient/8, cyClient/8, TRUE) ; for(ik=0;ik<4;ik++) MoveWindow (hwndRect[ik+4], (1%2)*cxClient/8+ik*cxClient/4, cyClient/8, cxClient/8, cyClient/8, TRUE) ; */ MoveWindow(hwnd,200,100,300,300,TRUE); for(ik=0;ik<4;ik++) for(im=0;im<8;im++) MoveWindow (hwndRect[ik+4*im], (im%2)*cxClient/8+ik*cxClient/4, im*cyClient/8, cxClient/8, cyClient/8, TRUE) ; return 0; case WM_DESTROY: PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }

 

 

运行结果如下图

result1 chess

 

[cpp] view plaincopyprint?
  1. 实例CTRL003利用多个子窗口制做简易五子棋  
  2. #include <windows.h>   
  3. LRESULT CALLBACK WndProc (HWNDUINTWPARAMLPARAM) ;//主窗口过程   
  4. LRESULT CALLBACK ChessWndProc (HWNDUINTWPARAMLPARAM) ;//棋盘cell窗口过程   
  5. TCHAR szChdChess[]=TEXT("ChessPlane");  
  6. #define iRow 15   
  7. #define iColumn 15   
  8. int iFlag=0;  
  9. int iYN[iRow][iColumn];  
  10. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,  
  11.                     PSTR szCmdLine, int iCmdShow)  
  12. {  
  13.      static TCHAR szAppName[] = TEXT ("MyCHess") ;//需用类名,故声明为静态,也可声明为全局变量   
  14.        
  15.      HWND         hwnd ;  
  16.      MSG          msg ;  
  17.      WNDCLASS     wndclass ; //主窗口类   
  18.      WNDCLASS     chd_chessclass;//棋盘子窗口类   
  19.      WNDCLASS     chd_stateclass;//状态子窗口类,可以用wndclass类为模板,但这样写是为了明确过程,便于理解   
  20.      //主窗口类   
  21.      wndclass.style         = CS_HREDRAW | CS_VREDRAW ;  
  22.      wndclass.lpfnWndProc   = WndProc ;  
  23.      wndclass.cbClsExtra    = 0 ;  
  24.      wndclass.cbWndExtra    = 0 ;  
  25.      wndclass.hInstance     = hInstance ;  
  26.      wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;  
  27.      wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;  
  28.      wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;  
  29.      wndclass.lpszMenuName  = NULL ;  
  30.      wndclass.lpszClassName = szAppName ;  
  31.      //棋盘子窗口类   
  32.      chd_chessclass.style         = CS_HREDRAW | CS_VREDRAW ; //创建窗体是加子(WS_CHILDWINDOW)窗体风格   
  33.      chd_chessclass.lpfnWndProc   = ChessWndProc ; //修改项:换成指定的窗口过程   
  34.      chd_chessclass.cbClsExtra    = 0 ;  
  35.      chd_chessclass.cbWndExtra    = sizeof(long) ;  
  36.      chd_chessclass.hInstance     = hInstance ;  
  37.      chd_chessclass.hIcon         = NULL;//修改项:不需要图标,设为NULL   
  38.      chd_chessclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;  
  39.      chd_chessclass.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH) ;//修改项:改为黑色   
  40.      chd_chessclass.lpszMenuName  = NULL ;  
  41.      chd_chessclass.lpszClassName = szChdChess ;//修改项:修改类名,窗口类之间相互区分的标识   
  42.      if (!RegisterClass (&wndclass))  
  43.      {  
  44.           MessageBox (NULL, TEXT ("This program requires Windows NT!"),   
  45.                       szAppName, MB_ICONERROR) ;  
  46.           return 0 ;  
  47.      }  
  48.      RegisterClass(&chd_chessclass);//注册自定义的窗口类   
  49.      hwnd = CreateWindow (szAppName,                  // window class name   
  50.                           TEXT ("SimpleChess"), // window caption   
  51.                           WS_OVERLAPPEDWINDOW& ~WS_MAXIMIZEBOX   
  52.                           & ~WS_THICKFRAME & ~ WS_MINIMIZEBOX,        // window style   
  53.                           CW_USEDEFAULT,              // initial x position   
  54.                           CW_USEDEFAULT,              // initial y position   
  55.                           CW_USEDEFAULT,              // initial x size   
  56.                           CW_USEDEFAULT,              // initial y size   
  57.                           NULL,                       // parent window handle   
  58.                           NULL,                       // window menu handle   
  59.                           hInstance,                  // program instance handle   
  60.                           NULL) ;                     // creation parameters   
  61.        
  62.        
  63.      ShowWindow (hwnd, iCmdShow) ;  
  64.      UpdateWindow (hwnd) ;  
  65.        
  66.      while (GetMessage (&msg, NULL, 0, 0))  
  67.      {  
  68.           TranslateMessage (&msg) ;  
  69.           DispatchMessage (&msg) ;  
  70.      }  
  71.      return msg.wParam ;  
  72. }  
  73. LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)  
  74. {  
  75.      //需将子窗口句柄声明为static或声明为全局变量,否则新建的窗口,在下次窗口过程调用中会丢失。   
  76.      static  HWND  hwndChess[iRow][iColumn];  
  77.      HDC         hdc ;  
  78.      PAINTSTRUCT ps ;  
  79.      RECT        rect ;  
  80.      int ixclient,iyclient,ik,iw,ixtemp,iytemp;  
  81.        
  82.      switch (message)  
  83.      {  
  84.      case WM_CREATE:  
  85.            
  86.           //创建chesscell窗体,加上子窗体风格,成为子窗体   
  87.          for(ik=0;ik<iRow;ik++)  
  88.              for(iw=0;iw<iColumn;iw++)  
  89.              {  
  90.          hwndChess[ik][iw]=CreateWindow (szChdChess, NULL,  
  91.                               WS_CHILDWINDOW | WS_VISIBLE,  
  92.                               0, 0, 0, 0,  
  93.                               hwnd, (HMENU)(iw+ik*iColumn),  
  94.                               (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE),  
  95.                               NULL) ;  
  96.              }  
  97.           MoveWindow(hwnd,0,0,600,600,TRUE);  
  98.           return 0 ;  
  99.             
  100.      case WM_PAINT:  
  101.           hdc = BeginPaint (hwnd, &ps) ;  
  102.           EndPaint (hwnd, &ps) ;  
  103.           return 0 ;  
  104.      case WM_SIZE:  
  105.           ixclient=LOWORD(lParam);  
  106.           iyclient=HIWORD(lParam);  
  107.           ixtemp=ixclient/iRow;  
  108.           iytemp=iyclient/iColumn;  
  109.           //重设窗体大小,重置窗体位置   
  110.          for(ik=0;ik<iRow;ik++)  
  111.              for(iw=0;iw<iColumn;iw++)  
  112.              {  
  113.                  MoveWindow(hwndChess[ik][iw],ixtemp*ik,iytemp*iw,ixtemp,iytemp,TRUE);//?????????   
  114.              }  
  115.             
  116.           return 0;  
  117.            
  118.      case WM_DESTROY:  
  119.           PostQuitMessage (0) ;  
  120.           return 0 ;  
  121.      }  
  122.      return DefWindowProc (hwnd, message, wParam, lParam) ;  
  123. }  
  124. LRESULT CALLBACK ChessWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)  
  125. {  
  126.      HDC         hdc ;  
  127.      PAINTSTRUCT ps ;  
  128.      RECT        rect ;  
  129.      HBRUSH      hChdBrush,holdBrush;  
  130.      HBRUSH      WorBBrush[2];  
  131.      int in=0;  
  132.        
  133.      switch (message)  
  134.      {  
  135.      case WM_CREATE:  
  136.           SetWindowLong(hwnd,0,0);//很有用的函数,可以传递一些信息   
  137.           return 0 ;  
  138.      case WM_LBUTTONDOWN :  
  139.           iFlag=1^iFlag;//1是黑,0是白   
  140.           //iYN[ik][iw]   
  141.           SetWindowLong(hwnd,0,1);  
  142.           InvalidateRect(hwnd,NULL,TRUE);//响应单击   
  143.           return 0;  
  144.       
  145.      case WM_PAINT:  
  146.           hdc = BeginPaint (hwnd, &ps) ;            
  147.           hChdBrush=CreateSolidBrush(RGB(110,110,110));  
  148.           holdBrush=SelectObject(hdc,hChdBrush);  
  149.           GetClientRect (hwnd, &rect) ;    
  150.           //填充背景色   
  151.           FillRect(hdc,&rect,hChdBrush);  
  152.    
  153.           //画网格   
  154.           MoveToEx(hdc,0,(rect.bottom-rect.top)/2,NULL);  
  155.           LineTo(hdc,rect.right,(rect.bottom-rect.top)/2);  
  156.           MoveToEx(hdc,(rect.right-rect.left)/2,0,NULL);  
  157.           LineTo(hdc,(rect.right-rect.left)/2,rect.bottom);  
  158.             
  159.           //画棋子   
  160.           //创建黑、白两个画刷   
  161.           if(GetWindowLong(hwnd,0))  
  162.           {  
  163.           WorBBrush[0]=CreateSolidBrush(RGB(0,0,0));  
  164.           WorBBrush[1]=CreateSolidBrush(RGB(255,255,255));  
  165.           //画黑或白棋子   
  166.           SelectObject(hdc,WorBBrush[iFlag]);  
  167.           Ellipse(hdc,0,0,rect.bottom,rect.right);  
  168.           DeleteObject(WorBBrush[0]);  
  169.           DeleteObject(WorBBrush[1]);  
  170.           }  
  171.           SelectObject(hdc,holdBrush);  
  172.           EndPaint (hwnd, &ps) ;  
  173.           return 0 ;  
  174.             
  175.      case WM_DESTROY:  
  176.           DeleteObject(hChdBrush);  
  177.           PostQuitMessage (0) ;  
  178.           return 0 ;  
  179.      }  
  180.      return DefWindowProc (hwnd, message, wParam, lParam) ;  
  181. }  
  182. 转自(http://blog.csdn.net/dreamcs/article/details/3888323)

转载于:https://www.cnblogs.com/Fightingbirds/archive/2013/01/03/2843407.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/301818.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 支付宝 退款_Java 支付宝支付,退款,单笔转账到支付宝账户(支付宝支付)

最近一直在接触第三方,刚接入完支付宝的API做一下总结,个人能力薄弱有不对的地方望指教. 做的是一个小型电商项目,所以会接入第三方的支付和登入功能, 第一次接入第三方撸了很多官方文档.然后创建应用选择需要接入的功能,有些应用是需要签约的签约就好了审核蛮快的.以上应用申…

DB排行榜更新,.NET Core+MySQL成主流!

上图是DB-Engines数据库流行度最新排行榜&#xff0c;Oracle、MySQL、SQLServer虽几经下滑&#xff0c;然而还是遥遥领先的前三名。后起之秀PostgreSQL和MongoDB持续增长&#xff0c;然而在体量上还相差甚远&#xff0c;可以预见这些年&#xff0c;三大关系型数据库的主流地位是…

史上最惨锦鲤即将来袭!奖品堪比5年高考3年模拟!

全世界只有3.14 % 的人关注了数据与算法之美在锦鲤盛行的2018年我们超级数学建模也跟风来了一个“史上最惨锦鲤”活动为什么叫史上最惨锦鲤呢因为平常看一本数学书就已经头疼了何况我们奖品还是100本数学书试问除了学霸还有谁能承受这种殊荣巧的是最后的得主还真是一个学霸那就…

人工智能读心术

全世界只有3.14 % 的人关注了数据与算法之美对于许多无法发出声音的人来说&#xff0c;他们想说的话会通过某种信号隐藏在大脑中。人类无法直接破译这些信号。但是&#xff0c;最近有三个研究小组在“破译”这种大脑语言密码上取得了一定进展。Science杂志最新报道了哥伦比亚大…

今日港股期货(港股期货今日交易动向)

港股期货收涨0.6% 首次突破31000点 今日港股期货大涨&#xff0c;形势一时看好。其中&#xff0c;恒生指数期货一度突破31000点关口&#xff0c;创出历史新高。分析人士表示&#xff0c;市场情绪积极&#xff0c;投资者对于全球经济复苏前景和中国经济增长的预期不断提高&…

春节特惠活动┃一张纸一幅图,竟然提高了10倍的学习和工作效率!?

▲数据汪特别推荐点击上图进入玩酷屋人类大脑的容量远远超出一般人的想象&#xff0c;时到21世纪的今天&#xff0c;我们对大脑的运用远远不够。大脑机能的使用率基于我们的思维模式&#xff0c;而思维导图正是开发大脑中最有效的利器&#xff01;之前小木给大家推荐了一套基于…

java class文件 代码_java_基础——用代码编译.java文件+加载class文件

java_基础——用代码编译.java文件加载class文件java_基础——用代码编译.java文件加载class文件【简单编译的流程】package com.zjm.www.test;import java.io.IOException;import javax.tools.JavaCompiler;import javax.tools.JavaCompiler.CompilationTask;import javax.too…

WPF 记一个Popup踩坑记录

看名字就知道&#xff0c;它是一个弹出控件&#xff0c;顾名思义&#xff0c;我们可以用它来实现类似Combobox那种&#xff0c;点击后弹出下面选项列表的操作。记录&#xff1a;需求&#xff1a;有一个文本框 &#xff0c;鼠标点击后&#xff0c;弹出一个Popup。我编写了以下xa…

通过电话号码获取姓名 (+86或者飞信)

2019独角兽企业重金招聘Python工程师标准>>> /** * 通过电话号码获取姓名 (86或者飞信) */ /* public String getContactName(String phoneNum) { String contactName "";// 处理电话号码格式问题 if (phoneNum.length() > 11) {ContentResolver cr …

春节特惠活动┃强烈推荐!孩子的科普从这套全球畅销250万册的最酷科学书起步...

▲数据汪特别推荐点击上图进入玩酷屋在马斯的学生时代的记忆中&#xff0c;数学定义定理、化学方程式、物理公式……这些科学知识点总是冷冰冰的&#xff0c;枯燥、深奥也总是科学的代名词。如今教育局明确规定科学课是小学必修课&#xff0c;孩子也逐步接受科学知识的熏陶。但…

删除未使用的引用 | Visual Studio 2019(16.10)新功能试用

当解决方案很小时&#xff0c;我们清楚地知道解决方案中使用了哪些项目引用和NuGet包&#xff0c;要想清理它们很容易。而对于大型的解决方案&#xff0c;有哪些包在使用中&#xff0c;开发人员很难找到它们&#xff0c;或者找起来可能很耗时。Visual Studio 2019(16.10)添加了…

女生转行IT与男生有什么不一样?

全世界只有3.14 % 的人关注了数据与算法之美在我的后台咨询者当中&#xff0c;女生向我咨询最多的问题就是&#xff1a;女生转行IT有什么困难&#xff1f;是不是很多IT企业都不要女生啊&#xff1f;女生的逻辑不如男生&#xff0c;是不是学不好编程&#xff1f;等等。1以上的所…

Blazor 基础入门

Blazor 基础知识IntroBlazor 是微软在 .NET 里推出的一个 WEB 客户端 UI 交互的框架&#xff0c;使用 Blazor 你可以代替 JavaScript 来实现自己的页面交互逻辑&#xff0c;可以很大程度上进行 C# 代码的复用&#xff0c;Blazor 对于 .NET 开发人员来说是一个不错的选择。托管模…

java 列表展开方式_android列表控件实现展开、收缩功能

最近在做一个Rss阅读器&#xff0c;我看了一看别人做的阅读器中的lisView可以伸缩&#xff0c;展开&#xff0c;我就在网上搜索了一下。果然让我找到&#xff0c;下面就我找到的一个小例子&#xff0c;给大家分享一下。ActivityMain .javapackage com.android;import android.a…

每个人都应该学习编程,因为它会教你如何思考

▲数据汪特别推荐点击上图进入玩酷屋扎克伯格11岁开始学习编程&#xff0c;创办Facebook&#xff1b;比尔盖茨13岁学习编程&#xff0c;创办微软……乔布斯说&#xff1a;“每一个人都应该学习电脑编程&#xff0c;因为它会教你如何思考。"现在在北京上海&#xff0c;顶级…

.NET Core HttpClient请求异常思考

【导读】上一篇我们讨论了针对项目上异常信息的具体分析而给出对应解决方案&#xff0c;本篇仅是我个人对相关异常信息了解过后的进一步学习和思考&#xff0c;希望对后续遇到此异常信息的同学们给予思路扩展下面我们结合如下两个异常信息进行大致排查分析&#xff0c;到底什么…

程序员编程10大原则,请牢牢记住!

全世界只有3.14 % 的人关注了数据与算法之美1、想清楚&#xff0c;再动手写代码刚入行的新手&#xff0c;为了展示自己的能力&#xff0c;拿到需求迫不及待地就开始上手写代码&#xff0c;大忌&#xff01;2、不交流&#xff0c;就会头破血流不爱说话和沟通&#xff0c;需求都理…

技术分享|基于SQL Server Change Tracking实现宽表的增量更新

源宝导读&#xff1a;在企业建设信息化的过程中&#xff0c;客户通常会使用一些数仓工具来构建数据资产&#xff0c;随着用户的要求越来越高&#xff0c;传统的ETL技术已经无法满足客户的实时性诉求&#xff0c;本文将分享“天际-数据平台”如何基于SQL Server来实现数仓数据的…

C# 文件操作详解(一)---------File类

C#对文件的操作相当方便&#xff0c;主要涉及到四个类&#xff1a;File、FileInfo、Directory、DirectoryInfo&#xff0c;前两个提供了针对文件的操作&#xff0c;后两个提供了针对目录的操作&#xff0c;类图关系如下&#xff1a; 图1&#xff1a;类图 下面通过实例来看下每个…

小时“数感”好,长大才能数学好

▲数据汪特别推荐点击上图进入玩酷屋很多妈妈都无比担心孩子的数学&#xff1a;孩子会不会像自己一样重蹈覆辙呢&#xff1f;在很多人眼里&#xff0c;数学是一堆怎么也弄不明白的公式、符号&#xff0c;而且是怎么努力怎么用功死活就是学不好的一门学科。可是&#xff0c;同样…