/*****************************************************************************************************
*文件说明:
* 资源头文件---resource.h
*开发环境:
* Win10+VS2012
*时间地点:
* 陕西师范大学 2017.1.2
*作 者:
* 九月
******************************************************************************************************/
#define IDI_APP 100 //[1]主窗口图标资源标识符
#define IDI_APPSMALL 101 //[2]主窗口小图标资源标识符
#define IDR_APP 102 //[3]主窗口菜单快捷键资源标识符
#define IDS_APP_TITLE 1000 //[4]应用程序标题资源标识符
#define IDM_FILE_NEW 1101
#define IDM_FILE_OPEN 1102
#define IDM_EXIT 1103
#define IDM_ABOUT 1104
#define IDM_SEPTEMBER 1105
/*****************************************************************************************************
*文件说明:
* 资源描述文件---resource.rc
*开发环境:
* Win10+VS2012
*时间地点:
* 陕西师范大学 2017.1.2
*作 者:
* 九月
******************************************************************************************************/
#include "resource.h"
#include <Windows.h>
IDD_APP ICON DISCARDABLE "res\\app.ico" //[1]主窗口图标资源
IDD_APPSMALL ICON DISCARDABLE "res\\appsmall.ico" //[2]主窗口小图标资源
IDR_APP MENU DISCARDABLE //[3]主窗口菜单资源
BEGIN
POPUP "文件(&F)"
BEGIN
MENUITEM "新建(&N)\tCtrl+N", IDM_FILE_NEW
MENUITEM "打开(&O)..\tCtrl_O" IDM_FILE_OPEN
MENUITEM "退出(&X)" IDM_EXIT
END
POPUP "帮助(&H)"
BEGIN
MENUITEM "软件简介(&A)" IDM_ABOUT
END
POPUP "九月软件"
BEGIN
MENUITEM "九月软件简介" IDM_SEPTEMBER
END
END
IDR_APP ACCELERATORS MOVEABLE PURE //[0]主窗口快捷键资源
BEGIN
"N",IDM_FILE_NEW
"O",IDM_FILE_OPEN, VIRTKEY,ALT
"X",IDM_EXIT, VIRTKEY,ALT
VK_F1,IDM_ABOUT, VIRTKEY
END
STRINGTABLE DISCARDABLE //[1]字符串资源
BEGIN
IDS_APP_TITLE "MainWindow" //[2]应用程序标题资源
END
/*****************************************************************************************************
*文件说明:
* 1--Win32_SDK编程---主程序
* 2--这是一个标准的Windows窗口程序,它有窗口,图标,菜单,资源,窗口过程,消息处理等元素,是SDK编程的程序
* 模板,成为基于窗口的Windows应用程序的编程框架
*变成框架:
* 这个变成框架是进行SDK编程的基础结构,其项目文件有:
* 1--程序文件(一般与项目同名)
* 2--资源头文件-------resource.h
* 3--资源描述文件-----resource.rc
* 4--存放在res子文件下的资源数据文件
*windows编程框架模块:
* 1--头文件:包含所有头文件或者链接库文件
* 2--全局定义:应用实例,主窗口变量,数据结构等全局定义,固定不变
* 3--消息处理函数原型
* 4--消息映射表宏定义
* 5--注册窗口类函数
* 6--初始化窗口
* 7--消息循环
* 8--主函数
* 9--消息处理函数的实现
*开发环境:
* Win10+VS2012
*时间地点:
* 陕西师范大学 2017.1.2
*作 者:
* 九月
******************************************************************************************************/
#include<Windows.h>
#include<stdio.h>
#include<iostream>
#include"resource.h"
#include<tchar.h>
/******************************************************************************************************
*模块说明:
* 全局变量定义
******************************************************************************************************/
HINSTANCE hInst; //[1]应用程序句柄实例
HWND hMainWnd; //[2]主窗口句柄
char szWindowTitle[] = "MainWindow"; //[3]主窗口标题
char szWindowClass[] = "SDKWIN32APP"; //[4]主窗口类名
/******************************************************************************************************
*模块说明:
* 消息映射表结构
******************************************************************************************************/
struct WIN_MSGMAP_ENTRY
{
UINT nMessage; //[1]消息码
LRESULT (*pfn)(HWND hwnd,UINT message,WPARAM wPatam,LPARAM lParam); //[2]窗口过程函数
};
#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()
/******************************************************************************************************
*模块说明:
* 函数原型声明
******************************************************************************************************/
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE hInstance,int nCmdShow);
int Run();
LRESULT CALLBACK WndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
/******************************************************************************************************
*函数说明:
* 1---WinMain是Windows程序的入口函数,与DOS程序中的Main函数的作用是一样的
* 2---WinMian主函数的作用是:
* 1--创建应用程序窗口
* 2--建立消息循环
*函数参数:
* 1---HINSTANCE hInstance------指针变量,当前应用程序的实例句柄
* 2---HINSTANCE hPrevInstace---指向当前应用程序前的一个实例句柄
* 3---LPSTR lpCmdLine------指向本程序命令行字符串的指针
* 4---int nCmdShow-------本程序窗口显示方式的标志
******************************************************************************************************/
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
MyRegisterClass(hInstance); //【1】注册窗口类
if(!InitInstance(hInstance,nCmdShow)) //【2】初始化窗口失败,退出程序
return 0;
return Run(); //【3】进入消息循环
}
/******************************************************************************************************
*函数说明:
* 模块1:注册窗口类---函数
*函数参数:
* HINSTANCE hInstance------指针变量,当前应用程序的句柄实例
******************************************************************************************************/
ATOM MyRegisterClass(HINSTANCE hInstance)
{
//【1】设计窗口
WNDCLASS wndCls;
wndCls.style = CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS; //[2]窗口样式
wndCls.lpfnWndProc = (WNDPROC)WndProc; //[3]指向窗口过程函数的函数指针
wndCls.cbClsExtra = 0;
wndCls.cbWndExtra = 0;
wndCls.hInstance = hInstance; //[4]应用程序实例句柄
wndCls.hIcon = LoadIcon(hInstance,(LPCTSTR)IDI_APP); //[5]主窗口图标
wndCls.hCursor = LoadCursor(NULL,IDC_ARROW); //[6]主窗口光标
wndCls.hbrBackground= (HBRUSH)GetStockObject(GRAY_BRUSH); //[7]主窗口背景颜色
wndCls.lpszMenuName = (LPCWSTR)IDR_APP; //[8]主窗口菜单
wndCls.lpszClassName= _T("MyWindow"); //[9]主窗口类名
wndCls.hIcon = LoadIcon(hInstance,(LPCWSTR)IDI_APPSMALL); //[10]小图标
//【2】注册窗口
return RegisterClass(&wndCls);
}
/******************************************************************************************************
*函数说明:
* 模块2:初始化窗口
*函数参数:
* HINSTANCE hInstance------指针变量,当前应用程序的句柄实例
******************************************************************************************************/
BOOL InitInstance(HINSTANCE hInstance,int nCmdShow)
{
DWORD ds = WS_OVERLAPPEDWINDOW;
hInst = hInstance; //[1]保存应用程序的实例
//[2]创建主窗口
hMainWnd = CreateWindow(_T("MyWindow"),_T("Win32示例"),ds,0,0,600,400,NULL,NULL,hInstance,NULL);
if(!hMainWnd)
return FALSE;
ShowWindow(hMainWnd,nCmdShow); //[3]显示主窗口
UpdateWindow(hMainWnd); //[4]更新主窗口
return TRUE;
}
/******************************************************************************************************
*函数说明:
* 模块3:消息循环
******************************************************************************************************/
int Run()
{
MSG msg;
HACCEL hAccelTable;
hAccelTable = LoadAccelerators(hInst,(LPCTSTR)IDR_APP); //[1]加载快捷键资源
while (GetMessage(&msg,NULL,0,0))
{
//将快捷键转换为相应的菜单命令
if(!TranslateAccelerator(msg.hwnd,hAccelTable,&msg))
{
TranslateMessage(&msg); //[2]将键盘事件转换成字符消息
DispatchMessage(&msg); //[3]分发消息到窗口的消息处理函数中去执行
}
}
return msg.wParam;
}
/******************************************************************************************************
*函数说明:
* 窗口过程函数
*函数参数:
* 1---HWND hwnd------发送消息的窗口句柄
* 2---UINT uMsg------系统传递过来的消息识别码
* 3---WPARAM wParam--消息附加参数1
* 4---LPARAM lParam--消息附加参数2
******************************************************************************************************/
LRESULT CALLBACK WndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
if (uMsg==WM_PAINT)
{
PAINTSTRUCT ps;
const HDC hDC = BeginPaint(hwnd,&ps);
RECT rect;
GetClientRect(hwnd,&rect);
DrawText(hDC,TEXT("Windows编程"),-1,&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
EndPaint(hwnd,&ps);
EndPaint(hwnd,&ps);
return 0;
}
else if(uMsg==WM_DESTROY)
{
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}