在VC++6.0里的Projects里创建一个Win32 Application工程,选择第三个“Hello World!”,代码如下:
#include "stdafx.h"
#include <tchar.h>
#include "resource.h"
LRESULT CALLBACK MyCR09WndProc(HWND hwnd,
UINT Message,
WPARAM wparam,
LPARAM lparam);
WNDCLASS MyRegisterClass(HINSTANCE hInstance )
{
//1、设计、注册窗口类
//要得到某一窗口的WNDCLASS数据,可以用GetClassLong();
//WNDCLASS中的回调函数是窗体的消息处理函数:
//一个WNDCLASS可以有多个窗口对象, 要得到某一窗口的窗口类,可以用GetClassName();
//初始化窗口类
WNDCLASS wndclass = {0};
//窗口类的风格,默认可以缺省
wndclass.style = CS_HREDRAW | CS_VREDRAW; ;
//窗口回调函数
wndclass.lpfnWndProc = MyCR09WndProc;
//窗口背景画刷 GetStockObject 函数检索预定义的备用笔、刷子、字体或者调色板的句柄。
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
//窗口指定紧随在 WNDCLASS 数据结构后分配的字节数。系统将其初始化为零。
wndclass.cbClsExtra = 0;
//指定紧随在窗口实例之后分配的字节数,系统将其初始化为零。
//如果应用程序正在用WNDCLASS结构注册一个在RC
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
//窗口类的光标 LoadCursor 加载你要的光标类型 失败返回NULL,成功返回句柄
wndclass.hCursor = LoadCursor(hInstance, IDC_ARROW);
//该窗口类的图标 LoadIcon 加载图标 MAKEINTRESOURCE指定你要的图标类型 自定义
wndclass.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));
//窗口类的主菜单名称 可以用MAKEINTRESOURCE指定你的类型 就是数值
wndclass.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
wndclass.lpszClassName = _T("CR09WndClass");
return wndclass;
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
//1 设计、注册窗口类
WNDCLASS wndclass = MyRegisterClass(hInstance);
//注册窗口类
if ( RegisterClass(&wndclass) == NULL )
{
MessageBox(NULL,_T("RegisterClass Error"),NULL,MB_OK);
return -1;
}
//2 创建窗口
HWND hWnd = NULL;
hWnd = CreateWindow( _T("CR09WndClass"),//窗口类名
_T("FirstWindow"), //窗口名称
WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX,
CW_USEDEFAULT,0,CW_USEDEFAULT,0,
NULL, //父窗口句柄
NULL,NULL,(LPVOID)100);
//WM_GETMINMAXINFO 0x24
//not client 非客户区
//WM_NCCREATE 0x0081
//WM_NCCALCSIZE 0x0083
//WM_CREATE 1
if ( hWnd == NULL )
{
MessageBox(NULL,_T("CreateWindow Error"),NULL,MB_OK);
return -1;
}
//3 显示、更新窗口
ShowWindow(hWnd,SW_NORMAL);
//发送了WM_PAINT消息 用来通知程序可以显示内容
UpdateWindow(hWnd);
//4 消息循环
MSG msg;
BOOL bRet;
//GetMessage(NULL) 取线程消息队列中的消息,并拿走
//GetMessage(Hwnd) 取线程消息队列中指定窗口(Hwnd)的消息,并拿走
//WM_QUIT消息 退出
while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0 )
{
if (bRet == -1)
{
// handle the error and possibly exit
break;
}
else
{
//分发消息
//msg.hwnd ==> WndClassName ==> MyCR09WndProc
//MyCR09WndProc( msg.hwnd, msg.message,msg.wParam,msg.lParam);
DispatchMessage(&msg);
}
}
//5 完成窗口的过程函数
return 0;
}
LRESULT CALLBACK MyCR09WndProc(HWND hwnd,
UINT Message,
WPARAM wparam,
LPARAM lparam)
{
switch (Message)
{
case WM_CREATE:
MessageBox(NULL,"WM_CREATE",NULL,MB_OK);
//lpParam = *lparam
break;
case WM_PAINT:
{
//何时收到消息
//1.改变窗口大小
//2.窗口恢复
//3.遮挡部分被移开时候
//4.UpDateWindow();
// DC 设备上下文 画布
PAINTSTRUCT ps;
RECT rc = {0,0,600,300};
// HWND ---> DC
// DC用到的时候取得 不要保留
HDC hdc = BeginPaint(hwnd,&ps);
DrawText(hdc,_T("Hello Wolrd"),
_tcslen(_T("Hello Wolrd")),
&rc,
DT_SINGLELINE|DT_CENTER|DT_VCENTER);
EndPaint(hwnd,&ps);
//输出调试信息
OutputDebugString("WM_PAINT");
}
break;
case WM_CLOSE:
{
if ( MessageBox(NULL,"是否关闭窗口?",NULL,MB_YESNO) == IDNO )
{
return 0;
}
}
break;
case WM_DESTROY:
{
//MessageBox(NULL,"WM_DESTROY",NULL,MB_OK);
//在线程消息队列中加入WM_QUIT消息而已
//EixtCode传递退出参数使用
PostQuitMessage(0);
}
break;
}
//WM_CLOSE DefWindowProc 销毁了窗口,发送了WM_DESTROY消息
//WM_DESTROY DefWindowProc 没有动作
return DefWindowProc(hwnd,Message,wparam,lparam);
}
posted on 2011-04-17 23:08
CrackerCS 阅读(384)
评论(0) 编辑 收藏 引用 所属分类:
API