需要什么函数库(.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. 好的web前端是如何拿到30万年薪的?

    2018年前端开发不再像过去几年里新技术框架层出不穷,而是各种组件,模块,很多东西都有痕迹可寻,技术都在原来的基础上有了革新和沉淀. 前端招聘方面也在紧跟技术发展,大量“滥竽充数”的速成开发者开始失去 ...

  2. Sublime text3 插件ColorPicker(调色板)不能使用快捷键的解决方法

    我的原因是:convertToUTF8和ColorPicker快捷键冲突,convertoUTF8的默认转换GBK的快捷键 和 ColorPicker打开调色板的快捷键都是ctrl+shift+c . ...

  3. [orangehrm] 安装问题集合

    Web server allows .htaccess files # 这一项检查不通过 解决: In conf/extra/httpd-vhosts.conf, add the line Allow ...

  4. LaTeX需要renewcommand的地方

    发现了两篇关于\renewcommand的文章,希望大家有更好的建议,请多多指教! 文章来源:http://blog.csdn.net/loveaborn/article/details/915205 ...

  5. JavaScript代码放在head和body的区别(QRCode生成)

    1.在head中时,所代表的functions只加载而不执行,执行是在某一事件触发后才开始. 2.在body中时,直接加载并执行 典型的区别: 如果有不在函数中的执行语句,比如变量初始化,如果在hea ...

  6. 7、Django实战第7天:用form实现登录

    Django提供了form对表单进行验证,比如今天要完成的限定登录的时候用户名和密码不能为空,通过这个操作,数据进入到数据库查询之前,我们就可以过滤很多错误,避免不必要的查询. 在users目录下新建 ...

  7. [BZOJ 1145] 图腾totem

    Link:https://www.lydsy.com/JudgeOnline/problem.php?id=1145 Solution: 算是一道神题了吧 设 f(abcd)为:当选出的四个数相对大小 ...

  8. BZOJ 1878 [SDOI2009]HH的项链(扫描线+树状数组)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1878 [题目大意] 给出一个数列,给出m个查询,每次查询一个区间中不相同的数字个数 [ ...

  9. Scala实战高手****第2课:Scala零基础实战入门的第一堂课及如何成为Scala高手

    val声明的不可变的战略意义:1.函数式编程中要求值不可变,val天然符合这一特性:2.在分布式系统中,一般都要求值不可变,这样才能够要求分布式系统的设计和实现,同时拥有更高的效率,val声明的内容都 ...

  10. SSH学习——Spring基础

    1.理解什么是Spring框架? spring是J2EE应用程序框架,是轻量级的IOC和AOP的容器框架,主要是针对javaBean的生命周期进行管理的轻量级容器,可以单独使用,也可以和Struts框 ...