初学VC:关于窗口的建立(麻烦帮看下代码,谢谢)

时间:2022-08-19 10:36:28
#include "stdafx.h"
//----------------------------------
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) ;

#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的第四个参数。

#9


谢谢各位高手的教导,我试试,谢谢了

#1


也是初学者,看不太懂

#2


你好,你可以先尝试一下用mfc编写窗口,刚开始学习没必要死抠sdk编程的细节,因为那样的话很容易让你对以后的学习丧失信心,等对整个vc有了一个系统的了解后可以再看看sdk

#3


参考PSDK下的示例。

#4


>问题1:wce.hbrBackground = (HBRUSH)(BLACK_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的第四个参数。

#9


谢谢各位高手的教导,我试试,谢谢了