VC++.NET 技术内幕学习二

原创 2012年03月31日 13:19:47

第十一章、windows消息处理和多线程编程

          Windows提供了两种线程:辅助线程和用户界面线程。用户界面线程有窗口,因此它有自己的消息循环,辅助线程没有窗口,没有自己的消息循环。

主线程无法通过消息和辅助线程通信,简单的解决办法是通过全局变量通信。

辅助线程可以通过消息和主线程通信,尽量选择post消息,在模式对话框中使用send消息会出问题。

         使用 volatile 修饰符能够确保一个线程检索由另一线程写入的最新值。

MFC库为用户界面线程提供了很好的支持。您可以从CWinApp派生一个类,并使用AfxBeginThread的一个重载版本来启动线程。您从CWinApp派生的类有它自己的InitInstance函数,最重要的是,它有自己的消息循环,你可以根据需要构造窗口并映射一些消息。假如你允许用户运行应用程序的多个实例,但又希望所有的实例共享内存,你可以配置单个进程,让它运行多个用户界面线程。比如:windows explorer就是

 

第十二章、菜单、加速键、复文本编辑控件和属性表

知识点:

         大多数命令消息都来自应用程序的框架窗口,而不是应用程序框架,因此,框架窗口才是放置消息控制函数的地方。借助于命令传递系统,可以在任何地方对消息进行控制,传递顺序为:视图、文档、(MDI子框架窗口在前)SDI主框架窗口、应用程序。

弹出式对话框中的按钮发送命令消息时,应用程序框架会首先把该命令传递给主框架窗口,因为所有的弹出式对话框都属于主框架窗口,之后进行命令传递。

控件的Prompt的属性这样加:添加一个新的条码数据!(状态栏)\n 添加一个新的条码数据!(气泡提示)。

 

第十三章、工具栏和状态栏

遇到的问题:

一、SelectStockObject();与SelectObject();的区别?

virtual CGdiObject*SelectStockObject( int nIndex );

只能选用系统定义好的对象,且参数为整形。系统仅定义了常用的CFont、CBrush、CPen三种。

CGdiObject*SelectObject(CGdiObject* pObject);

参数为:a pointer to an object of oneof the classes derived from CGdiObject,可用得指针有CFont、CBrush、CPen、CRgn、CBitmap。

二、宽字符串的复制。

宽字符串的复制如:

Strcpy用wcscpy,sprintf用swprintf代替,常数或字符前加L

_T宏会根据情况选择Unicode还是ANSI。_T,TEXT和_TEXT都是一样的。

LPCTSTR并不是一个指向CString对象的指针,而是一个支持Unicode的const char *的替代版本。

 

例子一、

CStringstrText("test");

wcsncpy(strText.GetBuffer(5),L"T", 1);

strText.ReleaseBuffer();

ASSERT(strText== "Test");

 

例子二、

wcscpy(cf.szFaceName,_T("宋体"));  //有ZeroMemory(&cf, sizeof(cf)); 操作,所以此语句也可实现

wcsncpy(cf.szFaceName,_T("Times New Roman"), 32); 

 

 

知识点:

    控制栏包括工具栏和状态栏,它属于应用程序框架。所以,控制栏对象的构造、析构以及窗口的创建都是由应用程序框架来管理的,代码位于MainFrm中。

    状态栏可支持两种类型的文本窗口:信息行窗口和状态指示器窗口。

信息行窗格中显示的是程序动态提供的字符串。可以通过CStatusBar::SetPaneText成员函数来设置信息行的内容,以0为基数从左到右递增。如:

    CMainFrame*pFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;

    CStatusBar*pStatus = &pFrame->m_wndStatusBar;

    pStatus->SetPaneText(0,"message line for first pane");

状态指示器窗格总是被链接到一个字符串资源上,它是否被显示完全取决于相应的更新命令UI消息控制函数。指示器是由一个字符串资源ID来标示的,该ID也被用来传递更新命令UI消息。如:

ON_UPDATE_COMMAND_UI(ID_INDICATOR_CAPS,OnUpdateKeyCapsLock)   //消息映射

void CMainFrame::OnUpdateKeyCapsLock(CCmdUI*pCmdUI)

{

         pCmdUI->Enable(::GetKyeStatus(VK_CAPITAL)& 1);

}

相关文章推荐

VC++.NET技术内幕学习一

第五章消息映射 遇到的问题: 一、映射模式。 坐标使用的经验规则: 1、  可以认为CDC的所有成员函数都以逻辑坐标作为其参数。 2、  可以认为CWnd的成员函数都以设备坐标作为其参数。 ...

VC++.NET 技术内幕学习四

第十六章、读和写文档 知识点: 序列化流程 持续文档对象 Serialize CArchive归档对象 CFile对象 磁盘 你在Serialize函数中需要做的就是,将数据存到归档对...

VC++.NET 技术内幕学习三

第十五章、文档与视图的分离 CView::GetDocument();非虚函数。返回的是指向文档的指针。 当MFC产生CView的派生类时,它同时也创建类型安全的GetDocument函数,该函数...

vc++.net技术内幕

  • 2013年03月25日 17:09
  • 35.54MB
  • 下载

VC++.net 技术内幕6 源码 part11

  • 2008年08月20日 17:58
  • 977KB
  • 下载

VC++技术内幕』学习笔记(10)

第十篇:模式对话框和通用控件(下)     大家好,雷神由于出差在外,所以笔记今天才写出抱歉。不知道大家有没有做上篇提到的计算器,计算器对雷神来说可是经典的程序,学VB先搞了计算器,学VC也搞了...

VC++.net 技术内幕6 源码part9

  • 2008年08月20日 17:50
  • 977KB
  • 下载

VC++.net 技术内幕6 源码 part3

  • 2008年08月20日 17:27
  • 977KB
  • 下载

VC++调用webservice (不使用.NET的托管技术)

正在看着AV(AreCont)SDK的时候,老大突然让我转到soap上,原因是刚进公司的我,第一项任务便是研究ONVIF(so many specifications),当然主要的还是看core ...

VC++.net 技术内幕6 源码 part8

  • 2008年08月20日 17:39
  • 977KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VC++.NET 技术内幕学习二
举报原因:
原因补充:

(最多只允许输入30个字)