//----------------------------------
long _stdcall WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
// char ch[5];
switch(message)
{
case WM_PAINT:
hdc = ::BeginPaint(hWnd,&ps);
::GetClientRect(hWnd,&rect);
:EndPaint(hWnd,&ps);
break;
case WM_DESTROY:
::PostQuitMessage(0);
break;
}
return::DefWindowProc(hWnd,message,wParam,lParam);
}
//--------------------------------------------------------------------------
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
static TCHAR szAppName[] = "MainForm";
MSG msg;
static HWND hWnd;
WNDCLASS wce;
RECT w;
POINT pt;
wce.style = CS_HREDRAW | CS_VREDRAW;
wce.lpfnWndProc = (WNDPROC)WndProc;
wce.cbClsExtra = 0
wce.cbWndExtra = 0;
wce.hCursor = ::LoadCursor(NULL,IDC_ARROW);
wce.hbrBackground = (HBRUSH)(BLACK_BRUSH);
wce.lpszMenuName = NULL;
wce.lpszClassName = szAppName;
wce.hInstance = hInstance;
if(!RegisterClass(&wce))
{
::MessageBox(hWnd,TEXT("注册失败!"),szAppName,MB_ICONERROR);
return 0;
}
hWnd = CreateWindow(szAppName,"Main Form",WS_BORDER|WS_SYSMENU,0,0,//WS_POPUP
800,600,NULL,NULL,hInstance,NULL);
::GetClientRect(hWnd,&w);
pt.x=w.right-w.left;
pt.y=w.bottom-w.top;
MoveWindow(hWnd, (GetSystemMetrics(SM_CXFULLSCREEN)- pt.x)/2,
(GetSystemMetrics(SM_CYFULLSCREEN)- pt.y)/2,
pt.x, pt.y, TRUE);
if(!hWnd)
{
long i = GetLastError();
return 0;
}
::ShowWindow(hWnd,SW_SHOW);
::UpdateWindow(hWnd);
while(::GetMessage(&msg,NULL,0,0))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
return msg.wParam;
}
问题1:wce.hbrBackground = (HBRUSH)(BLACK_BRUSH); //窗口颜色为什么不是黑色?
问题2:我想以这个新建的窗口做为主窗口,但不知怎么样用WinMain函数里的 hWnd?我设置为全局变量,程序运行后会死
问题3:新建子窗口的wce.lpfnWndProc 怎么设置呢?是不是建一个和主窗口一样的回调函数?
问题4:新建子窗口的hInstance值从哪获得?怎么获得呢?
本人比较菜,可能问的这些问题对于高手的您来说是小菜,请指教一二,谢谢
9 个解决方案
#1
也是初学者,看不太懂
#2
你好,你可以先尝试一下用mfc编写窗口,刚开始学习没必要死抠sdk编程的细节,因为那样的话很容易让你对以后的学习丧失信心,等对整个vc有了一个系统的了解后可以再看看sdk
#3
参考PSDK下的示例。
#4
>问题1:wce.hbrBackground = (HBRUSH)(BLACK_BRUSH); //窗口颜色为什么不是黑色?
----------------------------------------------------------------
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
----------------------------------------------------------------
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
#5
其余 ... 敬请参看 <Windows 程序设计>
#6
新建子窗口的wce.lpfnWndProc 怎么设置呢?是不是建一个和主窗口一样的回调函数?
是
是
#7
jf
#8
1、可能是楼主记错了,定义窗口类型的背景刷子时,用的是(HBRUSH)GetObject(BLACK_BRUSH)而不是 (HBRUSH)(BLACK_BRUSH);
2、不知道你建子窗口的代码写在哪里,一般都是在WndProc的WM_CREATE下,WndProc函数的参数中的hWnd就是对应窗口的句柄,如果在WinMain中建,直接用就好了。如果要在自定义的函数中用,在形参中传入。用不着定义全局变量
3、和主窗口一样,自定义一个WinProc
4、同2 新建子窗口的代码一般都是在WndProc的WM_CREATE下,而WM_CREATER消息的lParam其实是一个CREATESTRUCT结构的指针,它有一个成员就是hInstance,你可以这样写((LPCREATESTRUCT)lParam)->hInstance,而lParam是WinProc的第四个参数。
2、不知道你建子窗口的代码写在哪里,一般都是在WndProc的WM_CREATE下,WndProc函数的参数中的hWnd就是对应窗口的句柄,如果在WinMain中建,直接用就好了。如果要在自定义的函数中用,在形参中传入。用不着定义全局变量
3、和主窗口一样,自定义一个WinProc
4、同2 新建子窗口的代码一般都是在WndProc的WM_CREATE下,而WM_CREATER消息的lParam其实是一个CREATESTRUCT结构的指针,它有一个成员就是hInstance,你可以这样写((LPCREATESTRUCT)lParam)->hInstance,而lParam是WinProc的第四个参数。
#9
谢谢各位高手的教导,我试试,谢谢了
#1
也是初学者,看不太懂
#2
你好,你可以先尝试一下用mfc编写窗口,刚开始学习没必要死抠sdk编程的细节,因为那样的话很容易让你对以后的学习丧失信心,等对整个vc有了一个系统的了解后可以再看看sdk
#3
参考PSDK下的示例。
#4
>问题1:wce.hbrBackground = (HBRUSH)(BLACK_BRUSH); //窗口颜色为什么不是黑色?
----------------------------------------------------------------
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
----------------------------------------------------------------
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
#5
其余 ... 敬请参看 <Windows 程序设计>
#6
新建子窗口的wce.lpfnWndProc 怎么设置呢?是不是建一个和主窗口一样的回调函数?
是
是
#7
jf
#8
1、可能是楼主记错了,定义窗口类型的背景刷子时,用的是(HBRUSH)GetObject(BLACK_BRUSH)而不是 (HBRUSH)(BLACK_BRUSH);
2、不知道你建子窗口的代码写在哪里,一般都是在WndProc的WM_CREATE下,WndProc函数的参数中的hWnd就是对应窗口的句柄,如果在WinMain中建,直接用就好了。如果要在自定义的函数中用,在形参中传入。用不着定义全局变量
3、和主窗口一样,自定义一个WinProc
4、同2 新建子窗口的代码一般都是在WndProc的WM_CREATE下,而WM_CREATER消息的lParam其实是一个CREATESTRUCT结构的指针,它有一个成员就是hInstance,你可以这样写((LPCREATESTRUCT)lParam)->hInstance,而lParam是WinProc的第四个参数。
2、不知道你建子窗口的代码写在哪里,一般都是在WndProc的WM_CREATE下,WndProc函数的参数中的hWnd就是对应窗口的句柄,如果在WinMain中建,直接用就好了。如果要在自定义的函数中用,在形参中传入。用不着定义全局变量
3、和主窗口一样,自定义一个WinProc
4、同2 新建子窗口的代码一般都是在WndProc的WM_CREATE下,而WM_CREATER消息的lParam其实是一个CREATESTRUCT结构的指针,它有一个成员就是hInstance,你可以这样写((LPCREATESTRUCT)lParam)->hInstance,而lParam是WinProc的第四个参数。
#9
谢谢各位高手的教导,我试试,谢谢了