我将创建窗口的代码封装成一个SimpleWindow类,放在SimpleWindow.h和SimpleWindow.cpp文件中,然后在main.cpp中写了如下一段测试SimpleWindow类的代码,然后用VS2010命令行的方式编译,编译命令如下
cl /D UNICODE /D UNICODE main.cpp SimpleWindow.cpp /link /subsystem:windows /entry:wmain user32.lib gdi32.lib
发现报如下截图所示错误,
如果我改用如下命令就可以成功编译并运行
cl main.cpp SimpleWindow.cpp /link /subsystem:windows /entry:main user32.lib gdi32.lib
为什么会这样呢?
/*
* File name: main.cpp
* 测试SimpleWindow类
*/
#include "SimpleWindow.h"
/*
* 窗口过程函数
*/
LRESULT CALLBACK WindowProcedure(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_LBUTTONDOWN:
MessageBox(hWnd, TEXT("Left button is pressed."), TEXT(""), MB_OK);
return 0;
case WM_CLOSE:
if(MessageBox(hWnd, TEXT("Sure to close?"), TEXT(""), MB_YESNO) == IDYES)
DestroyWindow(hWnd);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hWnd, msg, wParam, lParam);
}
}
int _tmain()
{
/*
* 创建窗口,设置标题和窗口大小
*/
SimpleWindow myWindow(TEXT("My First Window"), 600, 400);
/*
* 显示窗口
*/
myWindow.Show();
/*
* 设置窗口过程函数
*/
myWindow.SetCallback(WindowProcedure);
/*
* 进入消息循环
*/
myWindow.LoopForRequest();
return 0;
}
下面为SimpleWindow.h代码
/*
* File name: SimpleWindow.h
* SimpleWindow类的接口定义
*/
#ifndef _SimpleWindow_h
#define _SimpleWindow_h
#include <windows.h>
#include <tchar.h>
class SimpleWindow
{
public:
SimpleWindow(PTSTR windowTitle, int windowWidth, int windowHeight);
void Show() const;
void LoopForRequest() const;
void SetCallback(WNDPROC WindowProcedure);
private:
bool registerWindowClass(LPTCH windowClassName);
private:
WNDCLASS wndClass;
HWND hWnd;
HINSTANCE hCurrentInstance;
};
#endif
下面为SimpleWindow.cpp代码
/*
* File name: SimpleWindow.cpp
* SimpleWindow类的实现
*/
#include "SimpleWindow.h"
/*
* 创建窗口句柄,指定窗口标题和窗口大小
*/
SimpleWindow::SimpleWindow(PTSTR windowTitle, int windowWidth, int windowHeight)
{
hCurrentInstance = GetModuleHandle(NULL);
if(!registerWindowClass(TEXT("SimpleWindow")))
{
MessageBox(NULL, TEXT("Can't register a window class."), windowTitle, MB_OK);
exit(EXIT_FAILURE);
}
hWnd = CreateWindow(TEXT("SimpleWindow"),
windowTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
windowWidth,
windowHeight,
NULL,
NULL,
hCurrentInstance,
NULL);
}
/*
* 显示窗口
*/
void SimpleWindow::Show() const
{
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
}
/*
* 进入消息循环
*/
void SimpleWindow::LoopForRequest() const
{
MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
/*
* 设置窗口过程函数
*/
void SimpleWindow::SetCallback(WNDPROC WindowProcedure)
{
SetWindowLong(hWnd, GWL_WNDPROC, (LONG)WindowProcedure);
}
/*
* 注册窗口类,注册成功则返回true,否则返回false
*/
bool SimpleWindow::registerWindowClass(LPTCH windowClassName)
{
wndClass.style = CS_HREDRAW|CS_VREDRAW;
wndClass.lpfnWndProc = DefWindowProc;
wndClass.cbClsExtra = 0;
wndClass.cbWndExtra = 0;
wndClass.hInstance = hCurrentInstance;
wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndClass.lpszMenuName = NULL;
wndClass.lpszClassName = windowClassName;
if(!RegisterClass(&wndClass))
return false;
else
return true;
}