一、Win32 API

 /********************************************************************
created: 2014/04/14 15:30
filename: WinMain.c
author: Justme0 (http://blog.csdn.net/justme0) purpose: Win32 API
*********************************************************************/ #include <windows.h>
#include <string.h> WCHAR *strText = L"请单击本窗口用户区"; /*
** 某事件发生时,处理该事件对应的消息
*/
LRESULT CALLBACK WndProc(
HWND hWindow,
UINT message,
WPARAM wParam,
LPARAM IParam)
{
PAINTSTRUCT ps;
HDC hdc; switch (message) {
case WM_LBUTTONDOWN:
strText = L"Hello, world!";
InvalidateRect(hWindow, NULL, );
break; case WM_PAINT:
hdc = BeginPaint(hWindow, &ps); TextOut(hdc, , , strText, wcslen(strText));
EndPaint(hWindow, &ps);
break; case WM_DESTROY:
PostQuitMessage();
break; default:
return DefWindowProc(hWindow, message, wParam, IParam);
} return ;
} /*
** 注册窗口,该窗口的名字是 wndName
*/
ATOM Register(HINSTANCE hInstance, WCHAR *wndName) {
WNDCLASS wnd;
wnd.cbClsExtra = ;
wnd.cbWndExtra = ;
wnd.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
wnd.hCursor = LoadCursor(NULL, IDC_ARROW);
wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wnd.hInstance = hInstance;
wnd.lpfnWndProc = WndProc;
wnd.lpszClassName = wndName;
wnd.lpszMenuName = NULL;
wnd.style = ; return RegisterClass(&wnd);
} /*
** 创建窗口,返回窗口句柄
*/
HWND Create(HINSTANCE hInstance, WCHAR *lpszClassName) {
return CreateWindow(
lpszClassName,
L"My Window",
WS_OVERLAPPEDWINDOW,
, , , ,
NULL,
NULL,
hInstance,
NULL);
} /*
** 消息循环
*/
int Run() {
MSG msg;
while (GetMessage(&msg, NULL, , )) {
TranslateMessage(&msg);
DispatchMessage(&msg);
} return msg.wParam;
} int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
HWND hWnd = NULL; // 窗口句柄
WCHAR wndName[] = L"Window_ClassName"; // 窗口名 Register(hInstance, wndName);
hWnd = Create(hInstance, wndName);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd); return Run();
}

二、OO模拟MFC

 /********************************************************************
created: 2014/04/14 20:37
filename: WinMain.cpp
author: Justme0 (http://blog.csdn.net/justme0) purpose: Windows程序设计,用 OO 模拟 MFC
*********************************************************************/ #include <Windows.h> WCHAR *strText = L"请单击本窗口用户区"; /*
** 某事件发生时,处理该事件对应的消息
*/
LRESULT CALLBACK WndProc(
HWND hWindow,
UINT message,
WPARAM wParam,
LPARAM IParam)
{
PAINTSTRUCT ps;
HDC hdc; switch (message) {
case WM_LBUTTONDOWN:
strText = L"Hello, world!";
InvalidateRect(hWindow, NULL, );
break; case WM_PAINT:
hdc = BeginPaint(hWindow, &ps); TextOut(hdc, , , strText, wcslen(strText));
EndPaint(hWindow, &ps);
break; case WM_DESTROY:
PostQuitMessage();
break; default:
return DefWindowProc(hWindow, message, wParam, IParam);
} return ;
} /*
** 窗体类
*/
class CFrameWnd {
protected:
HWND hWnd; public:
CFrameWnd() : hWnd(NULL) {} /*
** 注册窗口,该窗口的名字是 className
*/
ATOM Register(HINSTANCE hInstance, WCHAR *className) {
WNDCLASS wnd;
wnd.cbClsExtra = ;
wnd.cbWndExtra = ;
wnd.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
wnd.hCursor = LoadCursor(NULL, IDC_ARROW);
wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wnd.hInstance = hInstance;
wnd.lpfnWndProc = WndProc;
wnd.lpszClassName = className;
wnd.lpszMenuName = NULL;
wnd.style = ; return RegisterClass(&wnd);
} /*
** 创建窗口,返回窗口句柄
*/
void Create(HINSTANCE hInstance, WCHAR *className, WCHAR *wndName) {
this->hWnd = CreateWindow(
className,
wndName,
WS_OVERLAPPEDWINDOW,
, , , ,
NULL,
NULL,
hInstance,
NULL);
} void ShowWindow(int nCmdShow) {
::ShowWindow(this->hWnd, nCmdShow);
} void UpdateWindow() {
::UpdateWindow(this->hWnd);
}
}; /*
** `应用程序类
*/
class CWinApp {
protected:
CFrameWnd * m_pMainWnd; public:
CWinApp() : m_pMainWnd(NULL) {} virtual void InitInstance(HINSTANCE hInstance, int nCmdShow) {
m_pMainWnd = new CFrameWnd; WCHAR className[] = L"Window_ClassName"; // 窗口类名
WCHAR wndName[] = L"我的窗口"; // 窗口名
m_pMainWnd->Register(hInstance, className);
m_pMainWnd->Create(hInstance, className, wndName);
m_pMainWnd->ShowWindow(nCmdShow);
m_pMainWnd->UpdateWindow();
} /*
** 消息循环
*/
int Run() {
MSG msg;
while (GetMessage(&msg, NULL, , )) {
TranslateMessage(&msg);
DispatchMessage(&msg);
} return msg.wParam;
} virtual ~CWinApp() {
delete m_pMainWnd;
} }; class CWinAppDerived : public CWinApp {
public:
void InitInstance(HINSTANCE hInstance, int nCmdShow) {
m_pMainWnd = new CFrameWnd; WCHAR className[] = L"Window_ClassName"; // 窗口类名
WCHAR wndName[] = L"用新的 InitInstance 函数的程序"; // 窗口名
m_pMainWnd->Register(hInstance, className);
m_pMainWnd->Create(hInstance, className, wndName);
m_pMainWnd->ShowWindow(nCmdShow);
m_pMainWnd->UpdateWindow();
}
}; int APIENTRY WinMain(
__in HINSTANCE hInstance,
__in_opt HINSTANCE hPrevInstance,
__in LPSTR lpCmdLine,
__in int nShowCmd)
{
CWinApp myApp; // 或 CWinAppDerived myApp;
myApp.InitInstance(hInstance, nShowCmd); return myApp.Run();
}

三、消息处理函数的简单封装

 /********************************************************************
created: 2014/04/14 20:37
filename: WinMain.cpp
author: Justme0 (http://blog.csdn.net/justme0) purpose: Windows程序设计,用 OO 模拟 MFC
*********************************************************************/ #include <Windows.h> class CWinApp;
class CWinAppDerived;
CWinApp * AfxGetApp();
LRESULT CALLBACK WndProc(
HWND hWindow,
UINT message,
WPARAM wParam,
LPARAM IParam); WCHAR *gText = L"请单击本窗口用户区"; /*
** 具有处理消息的类
*/
class CCmdTarget {
protected:
HWND hWnd; public:
CCmdTarget() : hWnd(NULL) {} /*
** 某事件发生时,处理该事件对应的消息
*/
LRESULT CALLBACK AfxWndProc(
HWND hWindow,
UINT message,
WPARAM wParam,
LPARAM IParam)
{
switch (message) {
case WM_LBUTTONDOWN:
this->OnLButtonDown();
break; case WM_PAINT: {
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWindow, &ps);
this->OnDraw(hdc);
EndPaint(hWindow, &ps);
break; } case WM_DESTROY:
this->OnDestroy();
break; default:
return DefWindowProc(hWindow, message, wParam, IParam);
} return ;
} virtual void OnLButtonDown() {} virtual void OnDestroy() {
::PostQuitMessage();
} void OnDraw(HDC hdc) {
TextOut(hdc, , , gText, wcslen(gText));
}
}; /*
** 窗体类
*/
class CFrameWnd : public CCmdTarget {
public:
/*
** 注册窗口,该窗口的名字是 className
*/
ATOM Register(HINSTANCE hInstance, WCHAR *className) {
WNDCLASS wnd;
wnd.cbClsExtra = ;
wnd.cbWndExtra = ;
wnd.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
wnd.hCursor = LoadCursor(NULL, IDC_ARROW);
wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wnd.hInstance = hInstance;
wnd.lpfnWndProc = WndProc;
wnd.lpszClassName = className;
wnd.lpszMenuName = NULL;
wnd.style = ; return RegisterClass(&wnd);
} /*
** 创建窗口,返回窗口句柄
*/
void Create(HINSTANCE hInstance, WCHAR *className, WCHAR *wndName) {
this->hWnd = CreateWindow(
className,
wndName,
WS_OVERLAPPEDWINDOW,
, , , ,
NULL,
NULL,
hInstance,
NULL);
} void ShowWindow(int nCmdShow) {
::ShowWindow(this->hWnd, nCmdShow);
} void UpdateWindow() {
::UpdateWindow(this->hWnd);
}
}; class CFrameWndDerived : public CFrameWnd {
void OnLButtonDown() {
gText = L"重新定义的消息处理";
InvalidateRect(this->hWnd, NULL, );
}
}; /*
** `应用程序类
*/
class CWinApp {
public:
CFrameWnd *m_pMainWnd;
CWinApp *m_pSelfApp; public:
CWinApp() : m_pMainWnd(NULL) {
m_pSelfApp = this; // 不能直接初始化
} virtual void InitInstance(HINSTANCE hInstance, int nCmdShow) {
m_pMainWnd = new CFrameWnd; WCHAR className[] = L"Window_ClassName"; // 窗口类名
WCHAR wndName[] = L"CWinApp窗口"; // 窗口名
m_pMainWnd->Register(hInstance, className);
m_pMainWnd->Create(hInstance, className, wndName);
m_pMainWnd->ShowWindow(nCmdShow);
m_pMainWnd->UpdateWindow();
} /*
** 消息循环
*/
int Run() {
MSG msg;
while (GetMessage(&msg, NULL, , )) {
TranslateMessage(&msg);
DispatchMessage(&msg);
} return msg.wParam;
} virtual ~CWinApp() {
delete m_pMainWnd;
} friend CWinApp * AfxGetApp();
}; /*
** 派生的窗体类
*/
class CWinAppDerived : public CWinApp {
public:
void InitInstance(HINSTANCE hInstance, int nCmdShow) {
m_pMainWnd = new CFrameWndDerived; WCHAR className[] = L"Window_ClassName"; // 窗口类名
WCHAR wndName[] = L"CWinAppDerived窗口"; // 窗口名
m_pMainWnd->Register(hInstance, className);
m_pMainWnd->Create(hInstance, className, wndName);
m_pMainWnd->ShowWindow(nCmdShow);
m_pMainWnd->UpdateWindow();
}
}; LRESULT CALLBACK WndProc(
HWND hWindow,
UINT message,
WPARAM wParam,
LPARAM IParam)
{
CWinApp * pApp = AfxGetApp();
return pApp->m_pMainWnd->AfxWndProc(hWindow, message, wParam, IParam);
} CWinAppDerived g_myAppDerived; CWinApp * AfxGetApp() {
return g_myAppDerived.m_pSelfApp;
} int APIENTRY WinMain(
__in HINSTANCE hInstance,
__in_opt HINSTANCE hPrevInstance,
__in LPSTR lpCmdLine,
__in int nShowCmd)
{
CWinApp *pCWinApp = AfxGetApp();
pCWinApp->InitInstance(hInstance, nShowCmd); return pCWinApp->Run();
}

运行结果

四、用 MFC 设计的含有消息映射的 Windows 应用程序

 /********************************************************************
created: 2014/04/16 22:08
filename: WinMain.cpp
author: Justme0 (http://blog.csdn.net/justme0) purpose: 用 MFC 设计的含有消息映射的 Windows 应用程序 注:在“项目设置”中选择使用 MFC 类库(动态、静态皆可)
*********************************************************************/ #define _WIN32_WINNT 0x0502 #include <afxwin.h> class CFrameWndDerived : public CFrameWnd {
private:
WCHAR *showText; public:
CFrameWndDerived() : showText(L"初始化的字符串") {} afx_msg void OnPaint() {
CPaintDC dc(this);
dc.TextOut(, , showText);
} afx_msg void OnLButtonDown(UINT, CPoint) { // 这个参数表针对 VS 编译器
showText = L"有消息映射表的程序";
InvalidateRect(NULL, TRUE);
} DECLARE_MESSAGE_MAP();
}; BEGIN_MESSAGE_MAP(CFrameWndDerived, CFrameWnd)
ON_WM_PAINT()
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP() /*
** 派生的窗体类
*/
class CWinAppDerived : public CWinApp {
public:
BOOL InitInstance() {
CFrameWndDerived *pMainWndDerived = new CFrameWndDerived;
pMainWndDerived->Create(NULL, L"MFC");
pMainWndDerived->ShowWindow(m_nCmdShow);
pMainWndDerived->UpdateWindow();
m_pMainWnd = pMainWndDerived; return TRUE;
}
}; CWinAppDerived MyApp; // 实在费解,程序中哪里引用到了这个全局变量?怎么检测到这个全局变量的?

Windows 程序设计的更多相关文章

  1. 关于《Windows程序设计(第五版)》中一个实例程序的疑问

    最近一直在看Charlse Petzold的<Windows程序设计>,作为一个新得不能再新的新手,只能先照着书的抄抄源码了,之前的例子一直都很正常,但昨天遇到一个很诡异的BUG. 先看实 ...

  2. windows 程序设计自学:添加图标资源

    #include <windows.h> #include "resource.h" LRESULT CALLBACK MyWndProc( HWND hwnd, // ...

  3. windows程序设计笔记

    2014.05.06 新建一个visual C++ -- 常规 -- 空白 的项目,用.c后缀名指定这是一个用C语言来写的windows项目.和C语言的hellworld程序做了一个比较,按照wind ...

  4. 《Windows程序设计第5版》学习进度备忘

    书签:另外跳过的内容有待跟进 __________________学习资源: <Windows程序设计第5版珍藏版> __________________知识基础支持: _________ ...

  5. MFC Windows程序设计源代码免费下载

    本人近期在网上找到了<MFC Windows程序设计>第二版的书内程序的源代码,特意上传CSDN上面,供学习MFC的程序猿们免费下载. 源代码下载: http://download.csd ...

  6. windows 程序设计 SetPolyFillMode关于ALTERNATE、WINDING的详细解释

    看windows程序第五章GDI编程部分.一直卡壳在这里了. 下面我来说下自己的想法.看是否对您有帮助. 首先我们来看一个图. SetPolyFillMode(ALTERNATE);  // 系统默认 ...

  7. windows程序设计简介

    大家好,非常高兴和大家一起分享Windows开发心得,Windows已经诞生很多年了,一直因为它的简单易用而深受欢迎,相信很多人在使用Windows的时候,一定有这样一个想法:希望自己将来可以写一个很 ...

  8. 愉快的开始 - Windows程序设计(SDK)000

    愉快的开始 让编程改变世界 Change the world by program  参考教材 购买链接:Windows程序设计(第5版)(珍藏版)(附CD-ROM光盘1张)  学习环境 视频演示:W ...

  9. Windows程序设计学习笔记(一)Windows内存管理初步

    学习Windows程序设计也有一些时间了,为了记录自己的学习成果,以便以后查看,我希望自己能够坚持写下一系列的学习心得,对自己学习的内容进行总结,同时与大家交流.因为刚学习所以可能有的地方写不不正确, ...

随机推荐

  1. Url路径重写的原理

    ASP.net的地址重写(URLRewriter)实现原理及代码示例 吴剑 2007-01-01 原创文章,转载必需注明出处:http://www.cnblogs.com/wu-jian/ 概述 访问 ...

  2. 关于intellij IDEA 上junit的用法

    话说,最近正在看视频学java.里面有个叫做junit的东西很有用.但是实话说我摆弄了半天都没弄明白. 今天呢通过一些资料,终于弄清楚了junit的大致用法,这里写出来,用以分享和备忘. 首先,环境和 ...

  3. 两系统用asp.net forms 身份验证方式实现跨域登录信息共享

    1.两个系统的 web.config 都配置为 forms 验证方式( system.web —> authentication 节点) 2.在两个系统的Web.config里配置相同的 sys ...

  4. extends 和 implements

    extends是继承类与类的 implements是实现接口的 类与类之间只支持单继承 接口与接口之间支持多继承

  5. 环境搭建 Hadoop+Hive(orcfile格式)+Presto实现大数据存储查询一

    一.前言 Hadoop简介 Hadoop就是一个实现了Google云计算系统的开源系统,包括并行计算模型Map/Reduce,分布式文件系统HDFS,以及分布式数据库Hbase,同时Hadoop的相关 ...

  6. 11,SFDC 管理员篇 - 报表和数据的可视化

    1,Report Builder 1,每一个report type 都有一个 primay object 和多个相关的object 2,Primary object with related obje ...

  7. Ax 导出EXCEL给范围内的每个单元格加边框

    1. 首先在Class\SysExcelRange加画边框的方法 思路用EXCEL录宏的功能得到给一批单元格画格子的VBA代码,在AX将对象转为COM对象,基本VBA代码也能装为AX内能用的内容. p ...

  8. python转exe的小工具

    其实只是在cxfreeze的基础上加了个壳,做成窗口软件了 使用了pyqt做的界面,软件发布在了开源中国上,可以直接去下面的地址查看 http://git.oschina.net/robocky/py ...

  9. SQL计算时间差,要精确到小时分钟秒

    declare @starttime as datetime declare @endtime as datetime set @starttime = '2009-11-24 15:10:00' s ...

  10. EL表达式显示数据取整问题

    第一 插入fmt标签库 <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%&g ...