#include<windows.h>
#include<stdio.h>
WCHAR _szAppName[]=L"JohnTwo";
WCHAR _szTitle[]=L"MyfirstWindow";
LRESULT CALLBACK WinProc(HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
//WinMain函数与CallBack函数一样,一般由系统调用,如同c里的main函数
int WINAPI WinMain(HINSTANCE hInstance,//调用时系统分配
HINSTANCE hPrevInstance,//在目前状态下无用
LPSTR lpCmdLine, //由调用者传入
int nCmdShow //由调用者指定
)
{
WNDCLASS wc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//GetStockObject是用来获取对象句柄,这里是白色画刷的句柄
wc.hCursor=LoadCursor(NULL,IDC_CROSS);
wc.hIcon=LoadIcon(NULL,IDI_ERROR);
wc.hInstance=hInstance;
wc.lpfnWndProc=WinProc;//指向窗口过程函数
wc.lpszClassName=_szAppName;
wc.lpszMenuName=NULL;
wc.style=CS_HREDRAW | CS_VREDRAW;//在垂直和水平方向发生变化时重绘
//以上定义一个窗口结构完成
RegisterClass(&wc);
//创建窗口
HWND hwnd;
hwnd=CreateWindow(
_szAppName,//lpClassName
_szTitle,//lpWindowName
WS_OVERLAPPEDWINDOW,//dwStyle,创建的窗口样式
CW_USEDEFAULT, //x起始点
CW_USEDEFAULT, //y起始点
600, //宽
400, //高
NULL, //hWndParent,无
NULL, //hMenu,菜单也无
hInstance,
NULL //这里无附加消息
);
//显示及刷新窗口
ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd);
//定义消息结构,开始循环
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return static_cast<int>(msg.wParam);//由于.net支持std C++,所以要求比较严格
}
LRESULT CALLBACK WinProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch(uMsg)
{
case WM_CHAR:
WCHAR szChar[20];
swprintf(szChar,20,L"char code is %d", wParam);//注意了,这都是unicode环境
MessageBox(hwnd,szChar,TEXT("char"),0);
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd,TEXT("mouse clicked"),TEXT("message"),0);
HDC hdc; //定义一支笔
hdc=GetDC(hwnd);//拿起画板
TextOut(hdc,0,50,TEXT("我真正的第一个程序"),(int)wcslen(L"我真正的第一个程序"));//画画
ReleaseDC(hwnd,hdc);//放下画板
break;
case WM_PAINT:
HDC hDC;
PAINTSTRUCT ps;
hDC=BeginPaint(hwnd,&ps);
TextOut(hDC,0,0,TEXT("MyfirstApp"),(int)wcslen(L"MyfirstApp"));
EndPaint(hwnd,&ps);
break;
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,TEXT("是否真的结束?"),TEXT("message"),MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}
我周遭有不少朋友用孙鑫的书,但又用VC.NET2005版的开发环境学习,遇到不少困扰。这里推出一个该程序的VC.NET2005版本给大家 作参考。这个程序在VC.NET2005下编译通过,无错误、无警告。程序中多处使用了显示转换,严格来讲,应该用static_cast< typename>,我并没有全部这样,很多地方就用老式的转换方法,直接在需要转换的对象前添加一个“(new typename)”。最严格的、支持标准C++的编译器,或许会对此提出警告。不过VC.NET并不介意如此做。
另外,总结一下 二者的不同。大家最常碰到的恐怕是没有用“TEXT()”来处理常量字符串,导致蹦出一堆警告。其实,即便在VC6下,TEXT()也是被推荐的使用方法 (参看"Windows程序设计"第五版),而在VC.NET下,全面UNICODE化,更是如此。其它的一些主要的改动,也是由于UNICODE化引起 的,包括使用swprintf,WCHAR, wcslen等。