需要什么函数库(.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. (九)MySQL用户和权限管理

    (1)用户管理 1)登录和退出mysql 例: mysql -h192.168.111.150 -P3306 -uroot -predhat mysql -e 'select user,host,au ...

  2. 【转】进程、线程、 GIL全局解释器锁知识点整理

    转自:https://www.cnblogs.com/alex3714/articles/5230609.html 本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线 ...

  3. hdu6138(后缀数组)

    hdu6138 题意 给出若干个字符串,每次查询两个字符串,求两个字符串的公共子串且在给出的某一个字符串中作为前缀的最大长度. 分析 求公共子串:后缀数组 判断前缀:字典树 求完后缀数组,遍历下 \( ...

  4. 二分+Dfs【p1902】刺杀大使

    题目描述--->p1902 刺杀大使 题意概括: 找一条路径,使得从第1行到第n行路径的最大值最小. 分析: 题目概括出来,很容易想到二分. 求最大值最小,因此我们可以对最大伤害值进行二分. 如 ...

  5. SNMP OID批量枚举工具

    SNMP OID批量枚举工具   SNMP信息包含大量的系统.设备信息.这些信息均使用OID方式表示.由于OID编号规则复杂,不便于记忆.为了快速通过OID批量获取指定信息,Kali Linux新增了 ...

  6. C# 二维码扫描

    Zint类用于产生二维码.https://sourceforge.net/projects/zint/ Zxing类用于读取二维码. https://github.com/zxing/zxing AF ...

  7. delphi模态窗口跑到后面的解决办法

      Delphi(68)  procedure TForm1.ShowForm2;begin  Self.Enabled := False;  try    with TForm2.Create(ni ...

  8. [CSS]滚动条样式设置

    概述 最近项目中需要,将一个页面嵌入在一个webbrower中,这个webrower是定高的,在页面内容超过webbrower高度时,需要以滚动条的形式展现,当时也考虑了使用webbrower的滚动条 ...

  9. 【tomcat】FileNotFoundException: C:\Program Files\Java\apache-tomcat-8.5.11-geneshop3\webapps\ROOT\index.html (拒绝访问。)

    新装系统后,tomcat启动起来 提示如下错误: Caused by: java.io.FileNotFoundException: C:\Program Files\Java\apache-tomc ...

  10. flask前端优化:css/js/html压缩

    1.先压缩再传输,可以减少传输的大小,减少传输时间,但是压缩需要时间,所以最终页面显示是快了还是慢了,需要比较 2.先看html压缩模块:pip install Flask-HTMLmin 压缩前:大 ...