createwindows返回值为0,GetLastError结果为1407,不知道怎么解决,求帮助

_Joshua 2012-07-16 07:09:07
#include<windows.h>
HINSTANCE hinst;
HWND hwnd1;
HWND childhwnd[2];
TCHAR szAppName[]=TEXT("MTW"),szChild[]=TEXT("CHILD");
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK ChildWndProc(HWND,UINT,WPARAM,LPARAM);
int x=1;
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR szCmdLine,int iCmdShow)
{
MSG msg;
WNDCLASS wndclass,wndclass1;
wndclass.cbClsExtra =0;
wndclass.cbWndExtra =0;
wndclass.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor =LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon =LoadIcon(NULL,IDI_APPLICATION);
wndclass.hInstance =hInstance;
wndclass.lpfnWndProc =WndProc;
wndclass.lpszClassName =szAppName;
wndclass.style =CS_HREDRAW|CS_VREDRAW;
wndclass.lpszMenuName =NULL;
//x=RegisterClass(&wndclass);
if( !(RegisterClass (&wndclass)))
{
MessageBox (NULL, TEXT ("error 100"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd1=CreateWindow(szAppName,
TEXT("子窗口"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,NULL,NULL);
wndclass.lpfnWndProc =ChildWndProc;
wndclass.lpszClassName =TEXT("CHILD");
wndclass.hbrBackground =(HBRUSH)GetStockObject(GRAY_BRUSH);
wndclass.cbWndExtra =20;
if( !(RegisterClass (&wndclass)))
{
MessageBox (NULL, TEXT ("error 101"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
ShowWindow(hwnd1,iCmdShow);
UpdateWindow(hwnd1);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_CREATE:
for(int i=0;i<2;i++)
{
childhwnd[i]=CreateWindow(TEXT("CHILD"),
NULL,
WS_VISIBLE | WS_CHILD,
0,0,0,0,
hwnd,
(HMENU)i,
(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),
NULL);
// MessageBox(NULL,"Success!",NULL,0);
}
x=GetLastError();
return 0;
case WM_SIZE:
x=MoveWindow(childhwnd[0],0,0,LOWORD(lParam)/2,HIWORD(lParam),TRUE);
MoveWindow(childhwnd[1],LOWORD(lParam),0,LOWORD(lParam),HIWORD(lParam),TRUE);
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}
LRESULT CALLBACK ChildWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch(message)
{
case WM_CREATE:
MessageBox(NULL,"success!",NULL,0);
case WM_SIZE:
InvalidateRect(hwnd,NULL,true);
return 0;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
GetClientRect(hwnd,&rect);
Rectangle(hdc,0,0,rect.right,rect.bottom);
EndPaint(hwnd,&ps);
return 0;
case WM_LBUTTONDOWN:
MessageBox(NULL,"第一个子窗口","fist",0);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}
...全文
1174 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
_Joshua 2012-07-16
  • 打赏
  • 举报
回复 1
[Quote=引用 3 楼 的回复:]

要把
C/C++ code
wndclass.lpfnWndProc =ChildWndProc;
wndclass.lpszClassName =TEXT("CHILD");
wndclass.hbrBackground =(HBRUSH)GetStockObject(GRAY_BRUSH);
wndclass.cbWndExtra =20;
if( !(R……
[/Quote]也就是说我这段代码在第一个CreateWindow中触发了WM_CREATE,然后执行窗口过程中的CreateWindow函数,但是此时第一个CreateWindow还没执行完,而修改后的窗口类还没注册,所以就出现就出现了窗口类没找到的的错误.
  • 打赏
  • 举报
回复
窗口类设计完,也就是把WNDCLASS结构体填完之后是要先注册的
不然无法创建窗口
看这段SDK代码好亲切,想起当年默窗口过程的经历
stjay 2012-07-16
  • 打赏
  • 举报
回复
要把
wndclass.lpfnWndProc	 =ChildWndProc;
wndclass.lpszClassName =TEXT("CHILD");
wndclass.hbrBackground =(HBRUSH)GetStockObject(GRAY_BRUSH);
wndclass.cbWndExtra =20;
if( !(RegisterClass (&wndclass)))
{
MessageBox (NULL, TEXT ("error 101"),
szAppName, MB_ICONERROR) ;
return 0 ;
}

放到
hwnd1=CreateWindow(szAppName,
TEXT("子窗口"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,NULL,NULL);

前面
并不造成冲突
把注册"CHILD"那段的wndclass改成wndclass1

原因是WM_CREATE发生在CreateWindow创建窗口的过程中,此时CreateWindow还没执行完的
_Joshua 2012-07-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

没什么问题啊!很正常的一段代码。
[/Quote]
刚才我把第一个CreateWindwow跟第二个RegisterWindow换过来就没事了,如果按照上面的代码的话,子窗口就创建失败GetLastError的结果是1407,查了资料是窗口类不存在。
wltg2001 2012-07-16
  • 打赏
  • 举报
回复
没什么问题啊!很正常的一段代码。

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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