需要什么函数库(.lib)

windows支持动态链接库,应用程序所调用 的windows api 函数是在“执行期间“才链接上的。Windows程序调用 可以分为 C Runtimes以及windows api 大概两部分。早期的C Runtimes并不支持动态链接,vc++ 4.0之后已经支持。并且在32位已不在拥有small/medium/large等内存模式之分。

LIBC.lib:这是c Runtime函数库的静态版本
MSVCRT.lib:这是 c Runtime函数的动态库版本(MSVCRT40.dll)的import函数库。程序运行期间必须有MSVCRT40.dll在场。

另一组函数Windows Api由操作系统本身提供(GDI32.dll、USER32.DLL,Kernel32.DLL)。虽说动态链接库是在执行期间发生的。但是链接器仍需要先为调用者准备一些适当的信息。这些适当的信息放在”import函数库”,32位的windows的三大模块对应的 import函数库分别为GDI32.lib user32.lib kernel32.lib。

消息映射的雏形

《windows程序设计》里面的消息循环(WndPorc) switch case 语句 如下

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc; switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: 在此添加任意绘图代码...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage();
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return ;
}

为了把窗口函数设计一旬模块化,一般化。下面是一种做法。

//首先定义一个MSGMAP_ENTRY结构和一个dim宏
struct MSGMAP_ENTRY
{
UINT nMessage;
LONG (*pfn)(HWND ,UINT,WPARAM,LPARAM);
};
#define dim(x) (sizeof(x)/sizeof(x[0])) //把欲处理的消息以及消息处理全程关联性建立起来
struct MSGMAP_ENTRY _messageEntries[] =
{
WM_CREATE,OnCreate,
WM_PAINT,OnPaint,
WM_SIZE,OnSize,
WM_COMMAND,OnCommand,
WM_SETFOCUS,OnSetFocus,
WM_CLOSE,OnClose,
WM_DESTROY,OnDestroy
}; //Command-ID 与处理全程之间对照表格
struct MSGMAP_ENTRY _commandEntries[] =
{
IDM_ABOUT,OnAbout,
IDM_EXIT,OnExit
}; LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int i;
for(i = ;i < dim(_messageEntries);i++)
if(message == _messageEntries[i].nMessage)
return (*_messageEntries[i].pfn)(hWnd,message,wParam,lParam);
return DefWindowProc(hWnd,message,wParam,lParam);
} LONG OnCommand(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
for(int i =;i<dim(_commandEntries);i++)
if(LOWORD(wParam) == _commandEntries[i].nMessage)
return (*_commandEntries[i].pfn)(hWnd,message,wParam,lParam);
return DefWindowProc(hWnd,message,wParam,lParam);
} LONG OnCreate(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
} LONG OnAbout(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
} ...

这样WndPorc和OnCommand永远不变。每当处理新消息的时候给结构体里面加元素就行了

Windows 程序的生与死

\

空间时间的处理OnIdle

空间时间是指”系统中没以任何消息等待处理“的时间。空间时间常常发生,不要认为你鼠标移动时产生一大堆WM_MOUSEMOVE消息,事实上夹杂在每一个WM_MOUSEMOVE之间就可能存在许多空间时间。毕竟,计算机速度超乎想象。

后台工作最适宜在空闲时间做,传送sdk程序如果要处理空间时间,可以以下循环取代WinMain中的消息循环。

while(TRUE)
{
if(PeekMessage(&msg,NULL,,,PM_REMOVE))
{
if(mes.message == WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg)
}
else
OnIdle();
}

什么是 C Runtime 函数库的多线程版本

当 C Runtime函数库与20世纪70年代出来时 pc 容量很少,多任务是个新奇观念,更别提多线程了。因此当时产品基础所演化的 c runtime函数库在多线程的表现上出现了严重问题。无法被多线程程序调用 。
利用更种同步机制 如 critcal section mutex semaphore event 可以重新开发一套支持多线程的runtime 函数库。问题是加上这样的能力可能导致程序代码大小和执行效率都遭受不良的波及----即使你只激活了一个线程。

VC++的折衷方案是提供两种版本的 c runtime函数库。一种版本给单线程使用,一种版本给多线程程序使用。多线程版本的重大改变是第一、变量加errno者现在变成每个线程拥有一个,第二、多线程版本中的数据结构同步机制加以保护 。

Vc++一共有六个 c runtime函数库产品供您选择

  • Single-Threaded(static) libc.lib
  • Mutithreaded(static)   libcmt.lib
  • mutithread dll msvcrt.lib
  • debug single-threaded(static) libcd.lib
  • debug mutithreaded(static) libcmtd.lib
  • debug mutithread dll msvcrtd.lib

VC++编译器提供以下选项,让我们决定使用哪一个 c runtime函数库

  • /ML Single-threaded(static)
  • /MT Mutithread (static)
  • /MD Mutithread dll (dynamic import libray)
  • /MLD debug single-thread(static)
  • /MTD debug mutithread(static)
  • /MDD debug mutithread dll(dynamic import libray)

《深入浅出mfc》 第1章 笔记的更多相关文章

  1. 《MFC游戏开发》笔记三 游戏贴图与透明特效的实现

    本系列文章由七十一雾央编写,转载请注明出处. 313239 作者:七十一雾央 新浪微博:http://weibo.com/1689160943/profile?rightmod=1&wvr=5 ...

  2. 《MFC游戏开发》笔记二 建立工程、调整窗口

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9300383 作者:七十一雾央 新浪微博:http:/ ...

  3. 评侯捷的<深入浅出MFC>和李久进的<MFC深入浅出>

    侯捷的<深入浅出mfc>相信大家都已经很熟悉了,论坛上也有很多介绍,这里我就不多说了. 而李久进的<mfc深入浅出>,听说的人可能就少得多.原因听说是这本书当时没有怎么宣传,而 ...

  4. 深入浅出MFC——MFC六大关键技术仿真(二)

    1. 仿真MFC目的:以MFC为例,学习application framework的内部运行.MFC六大关键技术: (1)MFC程序的初始化过程 (2)RTTI(Runtime Type Inform ...

  5. 《深入浅出MFC》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <深入浅出MFC>内含光盘一片,书中所有原始码与可执行文件尽在其中. 作者简介 侯俊杰,先生不知何许人也,闲静少言,不慕荣利.好读书,求甚解:每有 ...

  6. 《MFC游戏开发》笔记十 游戏中的碰撞检测进阶:地图类型&障碍物判定

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9394465 作者:七十一雾央 新浪微博:http:// ...

  7. 《MFC游戏开发》笔记九 游戏中的碰撞判定初步&怪物运动简单AI

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9374935 作者:七十一雾央 新浪微博:http:// ...

  8. 《MFC游戏开发》笔记八 游戏特效的实现(二):粒子系统

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9360993 作者:七十一雾央 新浪微博:http:// ...

  9. 《MFC游戏开发》笔记七 游戏特效的实现(一):背景滚动

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9344721 作者:七十一雾央 新浪微博:http:// ...

  10. 《MFC游戏开发》笔记六 图像双缓冲技术:实现一个流畅的动画

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9334121 作者:七十一雾央 新浪微博:http:/ ...

随机推荐

  1. Tomcat 服务器基本知识

    Tomcat下载安装和配置  下载         下载地址: http://tomcat.apache.org        tomcat服务器分为很多版本, 其中包括windows版和linux版 ...

  2. HDU 6324.Problem F. Grab The Tree-博弈(思维) (2018 Multi-University Training Contest 3 1006)

    6324.Problem F. Grab The Tree 题目看着好难,但是题解说的很简单,写出来也很简单.能想出来就是简单的,想不出来就难(讲道理,就算是1+1的题目,看不出来就是难的啊). 和后 ...

  3. Java的Hashtable类(转)

    文章来源:http://blog.csdn.net/zhna123_2011/article/details/6741479 ps:直接copy 哈希表是一种重要的存储方式,也是一种常见的检索方法.其 ...

  4. HDU 1029 Ignatius and the Princess IV(数论)

    #include <bits/stdc++.h> using namespace std; int main(){ int n; while(~scanf("%d",& ...

  5. 洛谷 P1177 【模板】快速排序 【快速排序/multiset排序】

    题目描述 利用快速排序算法将读入的N个数从小到大排序后输出. 快速排序是信息学竞赛的必备算法之一.对于快速排序不是很了解的同学可以自行上网查询相关资料,掌握后独立完成.(C++选手请不要试图使用STL ...

  6. luoguP2296 寻找道路

    因为是出边与终点直接或间接相连,所以将边反向,从终边开始,将所有终边能到达的点都打上标记因为是最短路,所以不需要处理重边和自环,于是再跑最短路就好题目关键:路径上的所有点的出边所指向的点都直接或间接与 ...

  7. hdu6127

    hdu6127 题意 二维平面上存在一些点,每个点都有权值,任意两点组成的线段的权值为这两点权值的乘积,选定一条经过原点的直线,问怎样使得它经过的线段的权值之和最大. 分析 题目等价于用一条直线将平面 ...

  8. oracle tablespace usage status

    select a.tablespace_name, a.bytes / 1024 / 1024 "Sum MB", (a.bytes - b.bytes) / 1024 / 102 ...

  9. websocket、文件上传

    支持情况: 浏览器实现了websocket的浏览器:Chrome Supported in version 4+ Firefox Supported in version 4+ Internet Ex ...

  10. Awesome图标 | 如何在某些编辑软件中使用Font Awesome字体图标

    文章目录 Font Awesome 字体图标 在某些编辑软件中使用 Font Awesome 字体图标 Font Awesome 为您提供可缩放矢量图标,它可以被定制大小.颜色.阴影以及任何可以用 C ...