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

步骤: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 (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) ;
  • }

#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 (HWND, UINT, WPARAM, LPARAM) ;
  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. ShowWindow (hwnd, iCmdShow) ;
  40. UpdateWindow (hwnd) ;
  41. while (GetMessage (&msg, NULL, 0, 0))
  42. {
  43. TranslateMessage (&msg) ;
  44. DispatchMessage (&msg) ;
  45. }
  46. return msg.wParam ;
  47. }
  48. LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  49. {
  50. static HWND hwndRect[32];
  51. HINSTANCE hinstance;
  52. int       iw,ik,im,cxClient, cyClient ;//不能将它们定义在switch中
  53. switch (message)
  54. {
  55. case WM_CREATE:
  56. hinstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
  57. //得到程序的实例
  58. //窗体类别必需是static类,否则程序不能生成静态窗体。
  59. for(iw=0;iw<32;iw++)
  60. {
  61. hwndRect[iw]=CreateWindow(TEXT("STATIC"),NULL,
  62. WS_CHILD|WS_VISIBLE|SS_WHITERECT, //将static 窗体背景色设成白色,好像只能设成黑/白彩色
  63. 0,0,0,0,
  64. hwnd,(HMENU)iw,
  65. hinstance,
  66. NULL
  67. );
  68. }
  69. MoveWindow(hwnd,0,0,300,300,TRUE);
  70. return 0 ;
  71. case WM_SIZE:
  72. //MoveWindow(hwnd,0,0,400,400,TRUE);
  73. cxClient = LOWORD (lParam) ;//得到客户区宽度
  74. cyClient = HIWORD (lParam) ;//得到客户区高度
  75. //SetRect(&rcColor,icxClient/2,0,icxClient,icyClient);
  76. /*
  77. //归纳法
  78. for(ik=0;ik<4;ik++)
  79. //for(im=0;im<4;im++)
  80. MoveWindow (hwndRect[ik], (0%2+ik)*cxClient/4, 0, cxClient/8, cyClient/8, TRUE) ;
  81. for(ik=0;ik<4;ik++)
  82. MoveWindow (hwndRect[ik+4], (1%2)*cxClient/8+ik*cxClient/4, cyClient/8, cxClient/8, cyClient/8, TRUE) ;
  83. */
  84. MoveWindow(hwnd,200,100,300,300,TRUE);
  85. for(ik=0;ik<4;ik++)
  86. for(im=0;im<8;im++)
  87. MoveWindow (hwndRect[ik+4*im], (im%2)*cxClient/8+ik*cxClient/4, im*cyClient/8, cxClient/8, cyClient/8, TRUE) ;
  88. return 0;
  89. case WM_DESTROY:
  90. PostQuitMessage (0) ;
  91. return 0 ;
  92. }
  93. return DefWindowProc (hwnd, message, wParam, lParam) ;
  94. }

#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) ; }

运行结果如下图

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

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

API之子窗口创建 (转)相关推荐

  1. 第07课:使用 HTML 5 API 创建子窗口

    在 Electron 中还存在一种创建窗口的方式,就是使用 HTML 5 的 API 创建窗口.在 HTML 5 中提供了 window.open 方法用于打开一个子窗口,该方法返回一个 Browse ...

  2. 【二】Windows API 零门槛编程指南——CreateWindow 窗口创建 “万字长篇专业术语全解”

    本系列博文几乎没有难啃的"专业术语",尽量让读者能够看明白文章所述内容,是本系列博文的核心宗旨之一.(由于本人也是由于项目需要,所以才来查阅相关资料,文中出现的错误欢迎指出,共同进 ...

  3. python窗口图形界面编程上传图片_python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例...

    注意主窗口一定要为tk.Tk(),在主窗口上通过button的点击相应子函数创建子窗口,注意此时创建出来的窗口必须是Toplevel,否则出错. 至于用图片在窗口上绘图,则按代码所示即可. # -*- ...

  4. win32开发(创建子窗口)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 在win32中,有的时候需要创建额外的子窗口.所谓子窗口的概念,就是窗口本身不会超出母窗口的边界 ...

  5. Win32子窗口及其创建应用

    简介: 所谓的子窗口就是一个父窗口里的一个窗口,父窗口也叫主窗口.子窗口也是窗口,它有自己的回调函数.自己的窗口类.自己的创建.它位于主窗口里的一个区域,我们可以设置子窗口的大小和位置以及相关属性.子 ...

  6. 中年人学C语言Windows程序设计,20子窗口的创建

    今天, 我们要学习的就是 子窗口控件 的使用. 在其他一些 Windows应用软件上我们经常能够看到一些大致相同的按钮.复选框.组合框.列表框等控件, 这些控件很有可能就是使用 标准子窗口控件 来实现 ...

  7. mysql怎么创建窗口应用程序,Win32子窗口及其创建应用

    简介: 所谓的子窗口就是一个父窗口里的一个窗口,父窗口也叫主窗口.子窗口也是窗口,它有自己的回调函数.自己的窗口类.自己的创建.它位于主窗口里的一个区域,我们可以设置子窗口的大小和位置以及相关属性.子 ...

  8. 简介子窗口控件(api)

    子窗口控件 壹佰软件开发小组  整理编译   回忆第七章的CHECKER程序.这些程序显示了矩形网格.当您在一个矩形中按下鼠标按键时,该程序就画一个x:如果您再按一次鼠标按键,那么x就消失.虽然这个程 ...

  9. swing退出子窗口事件_如何创建有效的退出弹出窗口?

    如何创建有效的退出弹出窗口? 下面的退出弹出窗口为电子邮件列表增加了4153个订阅者: 这个提供折扣的弹出窗口,帮助Storiarts在60天之内挽回了96个弃单客户,从而额外创造了5000美元的销售 ...

最新文章

  1. 用jquery ajax做的select菜单,选中的效果
  2. 系统调用syscall---用户态切换到内核态的唯一途径
  3. lucene索引word/pdf/html/txt文件及检索(搜索引擎)
  4. 1017 A除以B (20分)
  5. MySQL数据库工具类之——DataTable批量加入MySQL数据库(Net版)
  6. magento 删除所有用户订单 delete order customer
  7. 12.present perfect(2)
  8. SUMIFS函数 、MATCH及INDEX函数
  9. 一份超全面的机器学习公共数据集
  10. 神武4最新服务器,《神武4》亲自体验现版本新区后的新区告白
  11. 洛必达法则的使用条件
  12. python--web--让python提供api服务--aiohttp
  13. bind()函数介绍
  14. 11矩阵空间、秩1矩阵和小世界图
  15. 高精度GNSS定位的校正服务——状态域(SSR)校正和观测域(OSR)校正
  16. pytorch绘制并显示loss曲线和acc曲线,LeNet5识别图像准确率
  17. 我的专业我做主计算机演讲稿,我的未来我做主演讲稿
  18. 量化中offer、bid、ask、best bid
  19. CentOS定时任务crontabs
  20. 倍福--ModbusRTU的配置

热门文章

  1. JSONObject和JSONArray 以及Mybatis传入Map类型参数
  2. 解读Facebook CAN:如何给人工智能赋予艺术创作的力量
  3. Chrome DevTools — Network 1
  4. artDialog ( v 6.0.2 ) content 参数引入页面 html 内容
  5. (转)svn检出的时候报 Unable to connect to a repository at URL错误
  6. java中自定义表单和流程_让驰骋工作流程引擎 ccbpm使用自定义表单来实现自己的业务逻辑....
  7. 基于dnn的车牌识别_自然场景中文文字识别,身份证火车票都能识别
  8. zbb20180710 maven Failed to read artifact descriptor--maven
  9. 15_新闻客户端_展示文字内容完成
  10. UVa 10061 How many zero's and how many digits?