现在的位置: 首页 > 综合 > 正文

Windows编程入门:基本编程框架

2013年09月24日 ⁄ 综合 ⁄ 共 3045字 ⁄ 字号 评论关闭

这里只是一个基本的编程框架,具体的说明请看其他博文的注释吧。

resource.h

//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ 生成的包含文件。
// 供 Work.rc 使用
//
#ifndef RESOURCE_H_INCLUDE
#define RESOURCE_H_INCLUDE

/****
*	Resource Define
*/

#define IDI_APP			100
#define IDI_APPSMALL	101
#define IDR_APP			102
#define	IDS_APP_TITLE	1000

#define IDM_FILE_NEW	1101
#define IDM_FILE_OPEN	1102
#define IDM_EXIT		1103
#define IDM_ABOUT		1104

#endif

 

Work.rc

#include <windows.h>
#include "resource.h"

IDI_APP			ICON DISCARDABLE "res\\app.ico"
IDI_APPSMALL	ICON DISCARDABLE "res\\appsmall.ico"
IDR_APP			MENU DISCARDABLE

BEGIN
	POPUP "文件(&F)"
	BEGIN
		MENUITEM "新建(&N)\tCtrl+N",			IDM_FILE_NEW
		MENUITEM "打开(&O)...\tCtrl+N",		IDM_FILE_OPEN
		MENUITEM SEPARATOR
		MENUITEM "退出(&X)",					IDM_EXIT
	END
	POPUP "帮助(&H)"
	BEGIN
		MENUITEM "软件简介(&A)...",			IDM_ABOUT
	END
END

IDR_APP ACCELERATORS MOVEABLE PURE
BEGIN
	"^N",	IDM_FILE_NEW
	"O",	IDM_FILE_OPEN,	VIRTKEY,CONTROL
	"X",	IDM_EXIT,		VIRTKEY,ALT
	VK_F1,	IDM_ABOUT,		VIRTKEY
END

STRINGABLE DISCARDABLE
BEGIN
	IDS_APP_TITLE "Happy Birthday"
END

 

main.cpp

#include <windows.h>
#include "resource.h"

HINSTANCE hInst;
HWND hMainWnd;
CONST WCHAR szWindowTitle[]=L"Happy Birthday";
CONST WCHAR szWindowClass[]=L"SDKWIN32APP";
typedef LRESULT (*__pfn_t)(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);

struct WIN_MSGMAP_ENTRY{
	UINT nMessage;
	__pfn_t pfn;
};
#define BEGIN_MESSAGE_MAP() CONST struct WIN_MSGMAP_ENTRY _messageEntries[]={
#define ON_MSG(nMessage,pfn) {nMessage,pfn},
#define END_MESSAGE_MAP() {0,NULL}};

BEGIN_MESSAGE_MAP()
//	ON_MSG()
END_MESSAGE_MAP()

LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam){
	WORD i;
	for (i=0;_messageEntries[i].nMessage;i++){
		if (message==_messageEntries[i].nMessage){
			if (message!=WM_DESTROY){
				return (*_messageEntries[i].pfn)(hWnd,message,wParam,lParam);
			}
			(*_messageEntries[i].pfn)(hWnd,message,wParam,lParam);
			break;
		}
	}
	if (message==WM_DESTROY){
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hWnd,message,wParam,lParam);
}

ATOM MyRegisterClass(HINSTANCE hInstance){
	WNDCLASSEX wcex;
	wcex.cbSize			=sizeof(WNDCLASSEX);
	wcex.style			=CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;
	wcex.lpfnWndProc	=(WNDPROC)WndProc;
	wcex.cbClsExtra		=0;
	wcex.cbWndExtra		=0;
	wcex.hInstance		=hInstance;
	wcex.hIcon			=LoadIcon(hInstance,(LPCTSTR)IDI_APP);
	wcex.hCursor		=LoadCursor(NULL,IDC_ARROW);
	wcex.hbrBackground	=(HBRUSH)GetStockObject(WHITE_BRUSH);
	wcex.lpszMenuName	=(LPCTSTR)IDR_APP;
	wcex.lpszClassName	=szWindowClass;
	wcex.hIconSm		=LoadIcon(hInstance,(LPCTSTR)IDI_APPSMALL);
	return RegisterClassEx(&wcex);
}

BOOL InitInstance(HINSTANCE hInstance,int nCmdShow){
	DWORD ds=WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN;
	hInst=hInstance;
	hMainWnd=CreateWindow(
		szWindowClass,szWindowTitle,ds,
		CW_USEDEFAULT,0,CW_USEDEFAULT,0,
		NULL,NULL,hInstance,NULL
	);
	if (!hMainWnd){
		return FALSE;
	}
	ShowWindow(hMainWnd,nCmdShow);
	UpdateWindow(hMainWnd);
	return TRUE;
}

int Run(){
	MSG msg;
	HACCEL hAccelTable;
	hAccelTable=LoadAccelerators(hInst,(LPCTSTR)IDR_APP);
	while (GetMessage(&msg,NULL,0,0)){
		if (!TranslateAccelerator(msg.hwnd,hAccelTable,&msg)){
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}
	return msg.wParam;
}

int APIENTRY WinMain(HINSTANCE hIstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
	MyRegisterClass(hIstance);
	if (!InitInstance(hIstance,nCmdShow)){
		return 0;
	}
	return Run();
}

 

下面是生成的应用程序(.exe)和实际运行时的窗口

抱歉!评论已关闭.