hur.cn - 华软网

 热门搜索

《MFC Windows应用程序设计》源代码疑问求助

  作者:未知    来源:网络    更新时间:2011/4/19
初学MFC,近几天在看清华大学出书社出书的《MFC Windows应用程序设计》,2.1.3节的代码大体上看得懂,不过关于参数的传送有两个疑问,请高人给予解答,下面附上源程序(问题在源码中)
C++">

//需要包括的头资料---------------------------------------------------------------------------
#include<windows.h>
//定义全局变量和函数------------------------------------------------------------------------
HINSTANCE hInst; //这个参数有什么作用?
HINSTANCE hInstance;    //hInstance不是应该从WinMain中猎取吗?设置成全局变量干什么?
MSG msg;
char lpszClassName[]="window_class";
char*ShowText;
//声明函数原型--------------------------------------------------------------------------------------
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//窗口函数
void OnLButtonDown(HWND hWnd, UINT message, 
WPARAM wParam, LPARAM lParam);
void OnPaint(HWND hWnd, UINT message, 
WPARAM wParam, LPARAM lParam);
void OnDestroy(HWND hWnd, UINT message, 
WPARAM wParam, LPARAM lParam);
//窗口类-----------------------------------------------------------------------------------------
class CFrameWnd
{
public:
HWND hWnd;
public:
int RegisterWindow();
void Create(LPCTSTR lpClassName,
LPCTSTR lpWindowName
);
void ShowWindow(int nCmdShow);
void UpdateWindow();
};
//窗口类的成员函数---------------------------------------------------------------------------
int CFrameWnd::RegisterWindow()
{
WNDCLASS wc;
wc.style=0;
wc.lpfnWndProc=WndProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInstance;    //hInstance参数的值应该是从WinMain()的形参中取得,这里为什么要从全局变量中猎取,难道是全局变量hInstance已经获得了WinMain()中响应参数的值了吗?我没有看出来
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName=NULL;
wc.lpszClassName=lpszClassName;
return RegisterClass(&wc);
}
void CFrameWnd::Create(LPCTSTR lpClassName,
   LPCTSTR lpWindowName)
{
RegisterWindow( );
hInst = hInstance;     //这条语句有什么作用?我尝试着注释掉,发现程序照样能够正常运行
hWnd = CreateWindow(lpszClassName,
lpWindowName, 
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 
0, 
CW_USEDEFAULT, 
0, 
NULL, 
NULL, 
hInstance, 
NULL);
}
void CFrameWnd::ShowWindow(int nCmdShow)
{
::ShowWindow(hWnd, nCmdShow);
}
void CFrameWnd::UpdateWindow()
{
::UpdateWindow(hWnd);
}

//应用程序类----------------------------------------------------------------------------------
class CWinApp
{
public:
CFrameWnd*m_pMainWnd;
public:
BOOL InitInstance (int nCmdShow);
int Run();
};
//应用程序类的成员函数-------------------------------------------------------------------
BOOL CWinApp::InitInstance(int nCmdShow)
{
m_pMainWnd=new CFrameWnd;
m_pMainWnd->Create(NULL,"封装的Windows程序");
m_pMainWnd->ShowWindow(nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}
int CWinApp::Run()
{
while (GetMessage(&msg, NULL, 0, 0)) 
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}

//程序员定义的WinApp的对象theApp----------------------------------------------------
CWinApp theApp;
//主函数------------------------------------------------------------------------------------------
int APIENTRY WinMain(HINSTANCE  hInstance,
                     HINSTANCE  hPrevInstance,
                     LPSTR      lpCmdLine,
                     int        nCmdShow)
{
int ResultCode=-1;
theApp.InitInstance(nCmdShow);
return ResultCode=theApp.Run();
}
//窗口函数的实现--------------------------------------------------------------------------------------
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, 
WPARAM wParam, LPARAM lParam)
{
switch (message) 
{
case WM_LBUTTONDOWN: OnLButtonDown(hWnd, message, wParam, lParam);
break;
case WM_PAINT: OnPaint(hWnd, message,wParam, lParam);
break;
case WM_DESTROY: OnDestroy(hWnd, message, wParam, lParam);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
   }
   return 0;
}
void OnLButtonDown(HWND hWnd, UINT message, 
WPARAM wParam, LPARAM lParam)
{
ShowText="Hello!";
InvalidateRect(hWnd,NULL,1);
}
void OnPaint(HWND hWnd, UINT message, 
WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
hdc = BeginPaint(hWnd, &ps);
TextOut(hdc,50,50,ShowText,6);
EndPaint(hWnd, &ps);
}
void OnDestroy(HWND hWnd, UINT message, 
WPARAM wParam, LPARAM lParam)
{
PostQuitMessage(0);
}
//-------------------------------------------------------------------------------------------

---华软 网友回答---
楼主你好!我看的是windows程序设计第5版也是初学者.目前学到键盘篇.下面我提一下自己的意见,不对的请大虾指点..
另外希望多认识下windows程序设计的初学者一起交流.QQ:178140423,有群的最好加我个.谢谢..

HINSTANCE hInst;    //这个参数有什么作用?   
这个hInst应该是指向父窗口的,通常是NULL.

HINSTANCE hInstance;    //hInstance不是应该从WinMain中猎取吗?设置成全局变量干什么?
你这里代码设置成全局变量应该是方便在函数里面赋值吧.

wc.hInstance=hInstance;    //hInstance参数的值应该是从WinMain()的形参中取得,这里为什么要从全局变量中猎取,难道是全局变量hInstance已经获得了WinMain()中响应参数的值了吗?我没有看出来

同理啊,这个问题是一样的.函数Create和WinMain不是在统一个函数,需要个变量来传送.不过我也没看懂WinMain函数从那里赋值给全局变量hInstance的.

另有我觉得你这代码好麻烦.我贴一下windows程序设计书中的MFC窗口创建,简单明了的多.下面请看.

#include <windows.h>



LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

int WINAPI WinMain(HINSTANCE hlnstance,HINSTANCE hPrevlnstance,LPSTR szCmdLine,int iCmdShow)
{
static TCHAR szAppName[] = TEXT("HELLOWin");
HWND hwnd;
MSG  msg;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra= 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hlnstance;
wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszClassName = szAppName;
wndclass.lpszMenuName = NULL;

if(!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("This program requires Windows XP!"),
szAppName,MB_ICONERROR);
return 0;
}

hwnd = CreateWindow(szAppName,
TEXT("The Hello Program"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hlnstance,
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)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch(message)
{
case WM_CREATE:
MessageBox(NULL,TEXT("HELLO BOY!"),TEXT("HELLO GIRL"),0);

return 0;

case WM_PAINT:
hdc = BeginPaint(hwnd,&ps);
GetClientRect(hwnd,&rect);

DrawText(hdc,TEXT("Hello,windowsxp!!"),-1,&rect,
DT_SINGLELINE | DT_CENTER |DT_VCENTER);

EndPaint(hwnd,&ps);
return 0;


case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}


---华软网友回复---
HINSTANCE hInst;    //这个参数有什么作用?                            
HINSTANCE hInstance;    //hInstance不是应该从WinMain中猎取吗?设置成全局变量干什么?

定义这么多应用程序实例句柄干什么?另外你的hInstance在那里赋值的?      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。