windows API使用时createwindow()的问题

weixin_43192342 2019-04-14 06:47:25
#include <windows.h> struct { int iStyle; TCHAR* szText; } button[] = { BS_DEFPUSHBUTTON, TEXT("1"), BS_DEFPUSHBUTTON, TEXT("2"), BS_DEFPUSHBUTTON, TEXT("3"), BS_DEFPUSHBUTTON, TEXT("4"), BS_DEFPUSHBUTTON, TEXT("5"), BS_DEFPUSHBUTTON, TEXT("6"), }; #define NUM (sizeof button / sizeof button[0]) LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK WndProcChild(HWND, UINT, WPARAM, LPARAM); WNDCLASSA wndclasschild; TCHAR szAppNameChild[] = TEXT("zichuamhkou"); static TCHAR szAppName[] = TEXT("window1"); static TCHAR szAppNameButton[] = TEXT("button"); WNDCLASS wndclass; WNDCLASS wndchild; MSG msgchild; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { 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; wndchild = wndclass; wndchild.lpfnWndProc = WndProcChild; wndchild.hInstance = hInstance; wndchild.lpszClassName = szAppNameChild; wndchild.lpszMenuName = (HMENU)234; if (!RegisterClass(&wndclass)) { MessageBox(NULL, TEXT("fail!"), TEXT("TEXT"), MB_OK); } hwnd = CreateWindow(szAppName, TEXT("first window"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 500, 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 RECT rect; /*static TCHAR szTop[] = TEXT("message wParam lParam"), szUnd[] = TEXT("______ ______ ______"), szFormat[] = TEXT("%-16s%04X-%04x %04X-%04X"), szBuffer[50];*/ static int cxChar, cyChar; HDC hdc; PAINTSTRUCT ps; int i; switch (message) { case WM_CREATE: cxChar = LOWORD(GetDialogBaseUnits()); cyChar = HIWORD(GetDialogBaseUnits()); for (i = 0; i < NUM; i++) { hwndButton[i] = CreateWindow(szAppNameButton, button[i].szText, WS_CHILD | WS_VISIBLE | button[i].iStyle, 2 * cxChar + 25, cyChar*(1 + 3 * i), 50 * cxChar, 7 * cyChar / 3, hwnd, (HMENU)i, ((LPCREATESTRUCT)lParam)->hInstance, NULL); } return 0; case WM_SIZE: rect.left = 24 * cxChar; rect.top = 2 * cyChar; rect.right = LOWORD(lParam); rect.bottom = HIWORD(lParam); return 0; case WM_PAINT: InvalidateRect(hwnd, &rect, FALSE); hdc = BeginPaint(hwnd, &ps); SelectObject(hdc, GetStockObject(SYSTEM_FIXED_FONT)); //SetBKMode(hdc, TRANSPARENT); //TextOut(hdc, 24 * cxChar, cyChar, szTop, lstrlen(szTop)); //TextOut(hdc, 24 * cxChar, cyChar, szUnd, lstrlen(szUnd)); EndPaint(hwnd, &ps); return 0; //case WM_DRAWITEM: case WM_COMMAND: //ScrollWindow(hwnd, 0, -cyChar, &rect, &rect); //hdc = GetDC(hwnd); //SelectObject(hdc, GetStockObject(SYSTEM_FIXED_FONT)); /*TextOut(hdc, 24 * cxChar, cyChar*(rect.bottom / cyChar - 1), szBuffer, wsprintf(szBuffer, szFormat, message == WM_DRAWITEM ? TEXT("WM_DRAWITEM") : TEXT("WM_COMMAND"), HIWORD(wParam), LOWORD(wParam), HIWORD(lParam), LOWORD(lParam)));*/ //ReleaseDC(hwnd, hdc); if (!RegisterClass(&wndchild)) { MessageBox(NULL, TEXT("fail!"), TEXT("TEXT"), MB_OK); } HWND hwndchild; hwndchild = CreateWindow(szAppNameChild, TEXT("second window"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 200, 200, NULL, (HMENU)1001, ((LPCREATESTRUCT)lParam)->hInstance, NULL); ShowWindow(hwnd, SW_SHOWNORMAL); UpdateWindow(hwndchild); while (GetMessage(&msgchild, NULL, 0, 0)) { TranslateMessage(&msgchild); DispatchMessage(&msgchild); } ValidateRect(hwnd, &rect); break; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); } LRESULT CALLBACK WndProcChild(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_DESTROY: PostQuitMessage(0); break; default: break; } return DefWindowProc(hwnd, message, wParam, lParam); } 运行后五个按钮,想单击按钮后显示另一个窗口于是在wm_command消息处理时调用createwindow(),但单击按钮后这个createwindow()函数报错:内存访问的问题,希望路过的朋友能指点一二。
...全文
477 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
伊航 2019-05-05
  • 打赏
  • 举报
回复
貌似不是CreateWindow的问题,好像是消息处理的问题。
ooolinux 2019-04-14
  • 打赏
  • 举报
回复
纯API方式已经不推荐了,效率太低,了解一下原理就可以了,主要是消息机制。 图形用户界面(GUI)编程可以学习C++ Builder,架构先进,入门比较容易。   C++ Builder是真正的可视化的开发工具。C++ Builder可以用鼠标拖拉控件加上设置属性轻松的“设计”出一个程序的图形用户界面,利用可视的组件/控件像“搭积木”一样,以“所见即所得”的方式搭建应用程序的界面,这也是C++ Builder这个名字中Builder的概念。这样,只需要用C++语言编写业务逻辑代码,类似于DOS下文本界面编程,只要专注于实现业务逻辑功能就可以了,代码非常简洁。数据的输入和表现,都在图形用户界面,非常直观、易用。这就是RAD开发(Rapid Application Development,快速应用程序开发)。 书籍推荐: 《C++Builder 6程序设计教程(第二版)》 (陆卫忠,刘文亮 等编著 /2011-04-01 /科学出版社)(当当网) 《C++Builder 6编程实例精解》(赵明现),PDF,是数字版的,非扫描版的,里面还有一个俄罗斯方块游戏的完整实现。 《精彩C++Builder 6程序设计》(台湾 吴逸贤),里面有10几个简单小游戏的实现,可以自己看懂以后再重写,才是自己掌握的。 《C++ Builder 5高级编程实例精解》(刘滨 编著)都是较大的实用的程序。 C++ Builder书籍下载: https://pan.baidu.com/s/13n9hxwVj9ai1p5L2rQC83Q

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧