WinMain程序入口
int WINAPI WinMain(HINSTANCE hInstance, 当前实例句柄 HINSTANCE hPrevInstance, 前一个实例句柄,标识同一程序最近的一个仍然活动的一个实例句柄 LPSTR pszCmdLine, 长指针,指向的字符串包含任何传送该程序的命令行参数 int nCmdShow 长整数,指明程序的窗口初始时是如何在Window中显示(是打开的窗口还是显示图标 )
nCmdShow 参数值如下:
SW_HIDE 隐蔽窗口,激活消息传给其他窗口 SW_MINMIZE 最小化显示 SW_RESTORE 恢复为SW_SHOWNORMAL方式 SW_SHOW 激活该窗口,用当前的位置和尺寸进行显示 SW_SHOWMAXIMIZED 激活该窗口,将显示为图标 SW_SHOWMINNOACTIVE 以图标方式启动程序 SW_SHOWNA 以该窗口的当前状态显示,激活窗口不变 SW_SHOWNOACTIVE 以该窗口最近尺寸和位置进行显示,活动窗口不变 SW_SHOWNORMAL 激活并显示该窗口,正常显示
窗口过程由WinMainProc过程来完成
用WNDCLASS设置窗口的特性
typedef struct _WNDCLASS{
UINT style; //如何修改、移动、缩放窗口 WNDPROC lpfnWndProc; //窗口类窗口函数指针 int cbClsExtra; //指向窗口类结构分配的额外字节数,处理窗口类的专用数据 int cbWndExtra; //指定用本窗口类建立的所有窗口结构分配的额处字节数,当有 两个以上窗口属于同一窗口类时,使用该域非常有用 HANDLE hInstance; //标识注册了此窗口的应用程序实例 HICON hIcon; //定义属于该窗口类的窗口缩成最小时显示的图标形状,表程序仍驻留内存中 HCURSOR hCursor; //定义使用窗口被 HBRUSH hbrBackground; LPCTSTR lpszMenuName; LPCTSTR lpszClassName;
}WNDCLASS;
style值:
CS_VREDRAW 垂直重画 CS_HREDRAW 水平重画 CS_OWNDC 独占设备描述表 CS_SAVEBITS 保存窗口覆盖区 CS_DBCLKS 允许两次连续按动 CS_BYTEALLGNCLIENT 鼠标用户区域按字节对齐显示 CS_BYTEALLGNWINDOW 鼠标用户窗口按字节对齐显示 CS_NOCLOSE 系统菜单中没有CLOSE菜单项
一个WINDOW程序的基本框架
#include "afxwin.h" LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsgId,WPARAM wParam,LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR pszCmdLine,int nCmdShow) //请参考 WinMain程序入口 { static char szAppName[]="Welcome to Windows!"; HWND hWnd; MSG msg; WNDCLASS wndClass; //请参考WNDCLASS窗口的注册 if(!hPrevInstance) { wndClass.lpszClassName=szAppName; wndClass.hInstance=hInstance; wndClass.lpfnWndProc=(WNDPROC)WindowProc; wndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION); wndClass.hCursor=LoadCursor(NULL,IDC_ARROW); wndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); wndClass.lpszMenuName=NULL; wndClass.style=CS_HREDRAW; //|CS_VERDRAW; wndClass.cbClsExtra=0; wndClass.cbWndExtra=0; } if(RegisterClass(&wndClass)==0) { return 0; } hWnd=CreateWindow(szAppName,szAppName,WS_OVERLAPPEDWINDOW,100,100,300,300, NULL,NULL,hInstance,NULL); if(hWnd==0) { return 0; } ShowWindow(hWnd,nCmdShow); while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; }
LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsgId,WPARAM wParam,LPARAM lParam) { static char *Str="Welcome to Window"; switch(uMsgId) { case WM_PAINT: HDC hDC; PAINTSTRUCT paintStruct; hDC=BeginPaint(hWnd,&paintStruct); TextOut(hDC,0,0,Str,::strlen(Str)); EndPaint(hWnd,&paintStruct); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc(hWnd,uMsgId,wParam,lParam); } }