鱼C论坛

 找回密码
 立即注册
查看: 775|回复: 1

win32子窗口求助

[复制链接]
发表于 2024-8-22 22:08:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include<windows.h>
  2. #include<windowsx.h>
  3. #include<strsafe.h>
  4. //每行和每列格子数
  5. #define LINE_COLUMN_BLOCK_COUNT 5
  6. bool Range(int r, int min, int max);
  7. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

  8. LRESULT CALLBACK ChildWndProc(HWND, UINT, WPARAM, LPARAM);
  9. TCHAR* ChildWndClsName = (TCHAR*)TEXT("CHILD__");
  10. int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
  11. {
  12.         TCHAR* szAppName = (TCHAR*)TEXT("MyAppWindows");
  13.         TCHAR* ChildWndClsName = (TCHAR*)TEXT("CHILD__");

  14.         HWND hwnd = NULL;
  15.         MSG msg;
  16.         WNDCLASS wc;
  17.         wc.style = CS_HREDRAW | CS_VREDRAW;
  18.         wc.lpfnWndProc = WndProc;
  19.         wc.cbClsExtra = 0;
  20.         wc.cbWndExtra = 0;
  21.         wc.hInstance = hInstance;
  22.         wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  23.         wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  24.         wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  25.         wc.lpszMenuName = NULL;
  26.         wc.lpszClassName = szAppName;

  27.         if (!RegisterClass(&wc))
  28.         {
  29.                 MessageBox(NULL, TEXT("Need Windows NT!!!!"), TEXT("Error"), MB_OK);
  30.         }

  31.         wc.lpfnWndProc = ChildWndProc;
  32.         wc.cbWndExtra =sizeof(long);
  33.         wc.hIcon = NULL;
  34.         wc.lpszClassName = ChildWndClsName;

  35.         RegisterClass(&wc);

  36.         hwnd = CreateWindow(szAppName, TEXT("我的窗口"),
  37.                 WS_OVERLAPPEDWINDOW,
  38.                 CW_USEDEFAULT,
  39.                 CW_USEDEFAULT,
  40.                 CW_USEDEFAULT,
  41.                 CW_USEDEFAULT,
  42.                 NULL,
  43.                 NULL,
  44.                 hInstance,
  45.                 NULL);

  46.         ShowWindow(hwnd, iCmdShow);

  47.         UpdateWindow(hwnd);

  48.         while (GetMessage(&msg, NULL, 0, 0))
  49.         {
  50.                 TranslateMessage(&msg);
  51.                 DispatchMessage(&msg);
  52.         }

  53.         return msg.wParam;
  54. }
  55. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
  56. {
  57.         static HWND hwndChild[LINE_COLUMN_BLOCK_COUNT][LINE_COLUMN_BLOCK_COUNT];
  58.         static int cxBlock, cyBlock, xIndex, yIndex;

  59.         static int cxClient, cyClient;

  60.         switch (message)
  61.         {
  62.         case WM_CREATE:

  63.                 for (size_t i = 0; i < LINE_COLUMN_BLOCK_COUNT; i++)
  64.                 {
  65.                         for (size_t j = 0; j < LINE_COLUMN_BLOCK_COUNT; j++)
  66.                         {
  67.                                 hwndChild[i][j] = CreateWindow(ChildWndClsName, NULL,
  68.                                         WS_CHILD | WS_VISIBLE,
  69.                                         0,
  70.                                         0,
  71.                                         0,
  72.                                         0,
  73.                                         hwnd,
  74.                                         (HMENU)(j << 8 | i),
  75.                                         (HINSTANCE)GetWindowLongPtr(hwnd, GWLP_HINSTANCE),
  76.                                         NULL);
  77.                         }
  78.                 }
  79.                 return 0;


  80.         case WM_SIZE:
  81.                 cxBlock = LOWORD(lparam) / LINE_COLUMN_BLOCK_COUNT;
  82.                 cyBlock = HIWORD(lparam) / LINE_COLUMN_BLOCK_COUNT;

  83.                 for (size_t i = 0; i < LINE_COLUMN_BLOCK_COUNT; i++)
  84.                 {
  85.                         for (size_t j = 0; j < LINE_COLUMN_BLOCK_COUNT; j++)
  86.                         {
  87.                                 MoveWindow(hwndChild[i][j], i * cxBlock, j * cyBlock, cxBlock, cyBlock, TRUE);
  88.                         }
  89.                 }


  90.                 return 0;
  91.         case WM_LBUTTONDOWN:
  92.                 MessageBeep(0);
  93.                 return 0;

  94.         case WM_DESTROY://接受WM_DESTROY消息并发送WM_QUIT消息
  95.                 PostQuitMessage(0);
  96.                 return 0;
  97.         }


  98.         return DefWindowProc(hwnd, message, wparam, lparam);
  99. }

  100. LRESULT CALLBACK ChildWndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
  101. {
  102.         HDC hdc;
  103.         PAINTSTRUCT ps;
  104.         RECT rect;

  105.         static int t,t0;
  106.         switch (message)
  107.         {
  108.         case WM_CREATE:
  109.                 SetWindowLongPtr(hwnd, 0, 0);
  110.                 hdc = GetDC(hwnd);

  111.                 TextOut(hdc, 0, 0, TEXT("a"), 1);
  112.                 ReleaseDC(hwnd, hdc);
  113.                 return 0;
  114.         case WM_LBUTTONDOWN:
  115.                 SetWindowLongPtr(hwnd, 0, (t0=!GetWindowLongPtr(hwnd, 0)));//在调试里面,这里t0明明是1
  116.                 hdc = GetDC(hwnd);

  117.                 t = GetWindowLongPtr(hwnd, 0);//但是在调试里面这里再获取的时候却莫名其妙变成0了???而且t0好像销毁不见了??
  118.                 ReleaseDC(hwnd, hdc);
  119.                 InvalidateRect(hwnd, NULL, FALSE);
  120.                 return 0;

  121.         case WM_PAINT:
  122.                 hdc = BeginPaint(hwnd, &ps);
  123.                 GetClientRect(hwnd, &rect);

  124.                 //画个矩形
  125.                 Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom);

  126.                 //画两条对角线
  127.                 if (GetWindowLongPtr(hwnd, 0))
  128.                 {
  129.                         MoveToEx(hdc, 0, 0, NULL);
  130.                         LineTo(hdc, rect.right, rect.bottom);

  131.                         MoveToEx(hdc, rect.right, 0, NULL);
  132.                         LineTo(hdc, 0, rect.bottom);
  133.                 }
  134.                 EndPaint(hwnd, &ps);
  135.                 return 0;
  136.         }

  137.         return DefWindowProc(hwnd, message, wparam, lparam);
  138. }
复制代码
请问为什么点击窗口没有反应?还有我在注释里面的两行问题,有没有大佬帮忙解答一下
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-8-22 22:08:35 | 显示全部楼层
FishC的鱼油,您好!根据您提供的代码,我注意到有几个问题需要修改和完善,特别是最后部分节点的完整性问题。我们来集中解决这些问题。

1. **未正确关闭 `WM_CREATE` `case` 语句:**
一个显而易见的问题是代码在 `for` 循环中的 `CreateWindow` 调用之后中断,缺少逻辑完成句,特别是 `WM_CREATE` 消息处理未正确结束。

2. **变量名覆盖问题:**
局部变量 `ChildWndClsName` 在 `WinMain` 中重新声明,覆盖了全局变量 `ChildWndClsName`,这会导致后面代码使用局部变量,而不是全局变量,建议移除或避免重新声明。

3. **资源清理以及未处理 `PostQuitMessage`:**
在窗口销毁时,PostQuitMessage 没有进行处理。

下面是更改与补充后的代码:

  1. #include <windows.h>

  2. // 每行和每列格子数
  3. #define LINE_COLUMN_BLOCK_COUNT 5
  4. bool Range(int r, int min, int max);
  5. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  6. LRESULT CALLBACK ChildWndProc(HWND, UINT, WPARAM, LPARAM);

  7. TCHAR* ChildWndClsName = (TCHAR*)TEXT("CHILD__");

  8. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
  9. {
  10.     TCHAR* szAppName = (TCHAR*)TEXT("MyAppWindows");

  11.     HWND hwnd;
  12.     MSG msg;
  13.     WNDCLASS wc;

  14.     wc.style = CS_HREDRAW | CS_VREDRAW;
  15.     wc.lpfnWndProc = WndProc;
  16.     wc.cbClsExtra = 0;
  17.     wc.cbWndExtra = 0;
  18.     wc.hInstance = hInstance;
  19.     wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  20.     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  21.     wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  22.     wc.lpszMenuName = NULL;
  23.     wc.lpszClassName = szAppName;

  24.     if (!RegisterClass(&wc))
  25.     {
  26.         MessageBox(NULL, TEXT("Need Windows NT!!!!"), TEXT("Error"), MB_OK);
  27.         return 0;
  28.     }

  29.     wc.lpfnWndProc = ChildWndProc;
  30.     wc.cbWndExtra = sizeof(long);
  31.     wc.hIcon = NULL;
  32.     wc.lpszClassName = ChildWndClsName;

  33.     if (!RegisterClass(&wc))
  34.     {
  35.         MessageBox(NULL, TEXT("Internal Error: Child Window Registration"), TEXT("Error"), MB_OK);
  36.         return 0;
  37.     }

  38.     hwnd = CreateWindow(szAppName, TEXT("我的窗口"),
  39.         WS_OVERLAPPEDWINDOW,
  40.         CW_USEDEFAULT,
  41.         CW_USEDEFAULT,
  42.         CW_USEDEFAULT,
  43.         CW_USEDEFAULT,
  44.         NULL,
  45.         NULL,
  46.         hInstance,
  47.         NULL);

  48.     ShowWindow(hwnd, iCmdShow);
  49.     UpdateWindow(hwnd);

  50.     while (GetMessage(&msg, NULL, 0, 0))
  51.     {
  52.         TranslateMessage(&msg);
  53.         DispatchMessage(&msg);
  54.     }

  55.     return msg.wParam;
  56. }

  57. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
  58. {
  59.     static HWND hwndChild[LINE_COLUMN_BLOCK_COUNT][LINE_COLUMN_BLOCK_COUNT];
  60.     static int cxBlock, cyBlock, xIndex, yIndex;
  61.     static int cxClient, cyClient;

  62.     switch (message)
  63.     {
  64.     case WM_CREATE:
  65.         for (size_t i = 0; i < LINE_COLUMN_BLOCK_COUNT; i++)
  66.         {
  67.             for (size_t j = 0; j < LINE_COLUMN_BLOCK_COUNT; j++)
  68.             {
  69.                 hwndChild[i][j] = CreateWindow(
  70.                     ChildWndClsName, NULL,
  71.                     WS_CHILD | WS_VISIBLE,
  72.                     0, 0, 0, 0,
  73.                     hwnd,
  74.                     (HMENU)(j * LINE_COLUMN_BLOCK_COUNT + i),
  75.                     (HINSTANCE) GetWindowLongPtr(hwnd, GWLP_HINSTANCE),
  76.                     NULL
  77.                 );

  78.                 if (!hwndChild[i][j])
  79.                 {
  80.                     MessageBox(hwnd, TEXT("Child Window Creation Failed"), TEXT("Error"), MB_OK);
  81.                     return -1;
  82.                 }
  83.             }
  84.         }
  85.         return 0;

  86.     case WM_SIZE:
  87.         cxClient = LOWORD(lparam);
  88.         cyClient = HIWORD(lparam);

  89.         cxBlock = cxClient / LINE_COLUMN_BLOCK_COUNT;
  90.         cyBlock = cyClient / LINE_COLUMN_BLOCK_COUNT;

  91.         for (size_t i = 0; i < LINE_COLUMN_BLOCK_COUNT; i++)
  92.         {
  93.             for (size_t j = 0; j < LINE_COLUMN_BLOCK_COUNT; j++)
  94.             {
  95.                 MoveWindow(
  96.                     hwndChild[i][j],
  97.                     j * cxBlock, i * cyBlock,
  98.                     cxBlock, cyBlock,
  99.                     TRUE
  100.                 );
  101.             }
  102.         }
  103.         return 0;

  104.     case WM_DESTROY:
  105.         PostQuitMessage(0);
  106.         return 0;
  107.     }
  108.     return DefWindowProc(hwnd, message, wparam, lparam);
  109. }

  110. LRESULT CALLBACK ChildWndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
  111. {
  112.     switch (message)
  113.     {
  114.     case WM_PAINT:
  115.     {
  116.         PAINTSTRUCT ps;
  117.         HDC hdc = BeginPaint(hwnd, &ps);
  118.         RECT rect;
  119.         GetClientRect(hwnd, &rect);
  120.         DrawText(hdc, TEXT("Child Window"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
  121.         EndPaint(hwnd, &ps);
  122.         return 0;
  123.     }
  124.     }
  125.     return DefWindowProc(hwnd, message, wparam, lparam);
  126. }
复制代码


请根据需要对代码进行调整并检查运行结果。希望能够帮助到您!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-6 14:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表