- 博客(46)
- 资源 (1)
- 收藏
- 关注
原创 自绘控件的方法
1.子类化控件 2.重写OnPaint:所有控件都是在OnPaint里画出来的,我们可以不调用父类的OnPaint,直接自己画控件。 3.重写控件能响应的各种鼠标键盘事件,通过状态位在OnPaint中画出不同事件下控件的样子,比如鼠标按下的状态对应宏BUTTON_DOWN,在响应函数中调用刷新函数OnPaint,OnPaint根据BUTTON_DOWN在界面上画出按钮按下的样子
2008-08-23 12:00:00
1214
原创 GDI画图的调用顺序
1.在内存中创建一个最终输出DC兼容的DC(CreateCompatibleDC) 2.在内存创建一个和最终输出DC兼容的bitmap(CreateCompatibleBitmap) 3.把2选入1(select) 4.画图 5.BitBlt到终输出DC 6.断开1和2的关联(select) 7.销毁2(DeleteObject) 8.销毁
2008-08-23 11:54:00
749
原创 GDI资源的释放
1.GetDC,GetWindowDC一定要ReleaseDC 2.CreateDC一定要DeleteDC。 3.Create出来的GDI对象一定要用DeleteObject释放,如CreateBitmap,CreateFont等 4.释放DC时,一定要保证没有自己创建的GDI对象还选在DC里 5.释放GDI对象时,确保它没有选进DC 6.GetStock
2008-08-23 11:46:00
1356
1
原创 界面编程笔记2
1.CDC是用于在设备上下文(Device Context,DC)中绘制图形的类,CGdiObject是用于绘制的类(一些GDI对象)2.选到CDC的GDI对象,通过落选(把老的或库存的GDI选景去替代新的)可在落选后自动释放。void CMyView::OnDraw(CDC *pDC){ CPen newpen(....); CPen pOldPen = pDC->SelectObject
2008-08-23 11:43:00
586
原创 界面编程笔记1
1.只要命令ID一样,响应函数就是一样的,所以工具栏按钮可以和菜单项设同一个ID,这样就可以相应同样的动作2.可以先用CStatic在一个dialog上框出一个区域,再把控件create上去3.InvalidateRect: 该函数向指定的窗体添加一个无效矩形以用来触发WM_PAINT更新该区域。窗口客户的无效矩形所代表的区域必须会被重绘 在Onpaint函数中可以用CDC来获取无效矩
2008-08-23 11:37:00
519
原创 UI界面设计闪烁问题的解决办法
一般的windows 复杂的界面需要使用多层窗口而且要用贴图来美化,所以不可避免在窗口移动或者改变大小的时候出现闪烁。先来谈谈闪烁产生的原因原因一:如果熟悉显卡原理的话,调用GDI函数向屏幕输出的时候并不是立刻就显示在屏幕上只是写到了显存里,而显卡每隔一段时间把显存的内容输出到屏幕上,这就是刷新周期。一般显卡的刷新周期是 1/80秒左右,具体数字可以自己设置的。这样问题就来了
2008-08-23 11:14:00
817
原创 编码知识
1.三种字符集: a.单字符字符集,使用一个字节表示字符,如ASCII b.多字节字符集,根据需要使用1个或多个字节,如GB2312 c.UNICODE,统一使用2个字节进行编码 2.GB2312(1980年)一共收录了7445个字符,包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7, 低字节从A1-FE,占用的码位是72*94=6768。其中
2008-08-23 11:03:00
700
原创 VC笔记4
1.构造函数执行顺序:基类(按声明顺序)->内嵌成员(按声明顺序)->本类, 析构函数与之严格相反:本类->内嵌成员(按声明顺序反序)->基类(按声明顺序反序) 2.虚析构函数: 虚析构函数在把子类new一个赋给父类指针时,delete这个指针时,调用的是子类的析构函数(子类的析构函数会调用父类的析构函数) 3.父类指针强转成子类指针后,如果是在栈上,不会调用子类的析构函数,如果在堆上,
2008-08-23 11:00:00
474
原创 IDE操作
1.在应用程序属性->资源->命令行->附加选项中添加 /d "AFC_TAG_CHS" 或 /d "AFC_TAG_ENU"宏即可控制将程序编译成中文或英文2.图标要放到工程的res目录下才能导入
2008-08-23 10:52:00
526
原创 子类化
1.子类化是将一个控件资源映射到一个控件类中,比如一个按钮IDC_BUTTON映射到类CMyButton。2.控件子类化后,消息由MFC同一的窗口过程AfxWndProc统一进行消息路由,消息首先路由到子类,再向父对话框路由。3.可以使用DDX机制进行子类化:DDX_Control(pDX, IDC_PORT, m_myButton); //m_myButton是CMyBu
2008-08-01 14:20:00
543
原创 双缓冲画图
1.用CreateCompatibleDC创建与目标窗口兼容的内存DC 2.把一个位图选进内存DC 3.在内存的位图上画图4.用BitBlt把内存DC中的像素画到屏幕上的目标窗口CreateCompatibleDC创建的时候,会默认把一个一个像素长一个像素宽的单色位图选进去,绘图之前,必须先创建一个位图(指定合适的长宽),然后选进内存DC。所有在内存DC上的作图
2008-07-06 20:20:00
777
原创 GetExitCodeThread判断线程是否执行完
int main(){ HANDLE hThrd1; HANDLE hThrd2; DWORD exitCode1 = 0; DWORD exitCode2 = 0; DWORD threadId; hThrd1 = CreateThread(NULL, 0,
2008-07-06 18:15:00
10368
原创 CDialogBar
1.在MainFrame的OnCreate中用CDialogBar的Create创建CDialogBar即可显示,EnableDocking和DockControlBar来设置是否可以停靠。注意必须是成员变量或堆上的对象来Create,不能用栈上的对象来create2.CDialogBar上的按钮等控件默认是灰色的,必须创建DialgBar资源对应的一个类,在类中写如下代码: ON_
2008-07-06 10:52:00
714
原创 基于VC++的GDI常用坐标系统及应用
在Windows应用程序中,只要进行绘图,就要使用GDI坐标系统。Windows提供了几种映射方式,每一种映射都对应着一种坐标系。例如,绘制图形时,必须给出图形各个点在客户区的位置,其位置用x 和y两个坐标表示,x 表示横坐标,y表示纵坐标。在所有的GDI绘制函数中,这些坐标使用的是一种“逻辑单位”。当GDI函数将结果输出送到某个物理设备上时,Windows将逻辑坐标转换成设备坐标(如屏幕或打印机
2008-07-05 18:19:00
1291
3
原创 逻辑坐标,设备坐标,窗口,视口
综述:1.画图在逻辑坐标中画,使用逻辑单位,显示图形在物理坐标中显示 2.屏幕上有三种不同的物理坐标,每种物理坐标是固定死的,原点,XY轴方向都不变 1、客户区域坐标,包括应用程序的客户区域,客户区域的左上角为(0, 0)。 2、屏幕坐标,包括整个屏幕,屏幕的左上角为(0, 0)。屏幕坐标用在WM_MOVE消息中(对于非子窗口)以
2008-07-05 17:54:00
3776
2
原创 VC调用Python
1.首先安装好python库,设置好相应的include和lib路径:把“PythonWin/include”加入包含路径,把“PythonWin/libs"加入附加库路径,然后在调用python的cpp头中加入:#include "python.h"2.调用Py_Initialize初始化python解析器环境3.在c中,python所有对象都是PyObject,常用PyObje
2008-07-05 12:50:00
3866
原创 VC笔记3
1.字节对齐: 1.各数据类型自身对齐值就是它的类型所占内存大小 2.用#pragma pack(value)制定对齐值value(32位机默认是4) 3.一个结构(数组,类,结构体,联合体等)中的成员的实际对齐值是成员自身对齐值和指定对齐值中较小的一个 4.一个结构(数组,类,结构体,联合体等)的对齐值是max(各个成员的实际对齐值) 5.一个数据的对齐值是a,
2008-07-04 21:59:00
490
原创 VC笔记2
1.类中没有成员变量时,大小应该是0,但是0不好在内存中定位一个地址,所以规定大小为0的对象占一个字节空间,一旦有成员变量,不会再增加这一个字节2.成员函数不占空间,有vitrual函数的对象要维护一个指向vitual函数的函数表指针,所以要多占四个字节。 3.如果一个对象向父类方向向上强转,则它的内容会被切割和父类一样。 4.static成员不占对象存储空间,它存在堆中。
2008-07-04 21:53:00
614
原创 VC笔记1
1.static声明的全局变量只能在本文件中使用,声明的局部变量代表静态变量,声明的全局函数也只用文件作用域2.C++中的常类型实现了对共享的保护: a.常引用:所引用对象不能被更新 b.常对象:必须初始化,且不能被更新 CMyClass const myclass(3,4) 常对象只能调用常成员函数,以保证其不能改变数据成员
2008-07-04 21:46:00
539
原创 COM笔记1
1.IID:Interface indentifier CLSID:class indentifier GUID GUID:global unique indentifier GUID是一个16字节长的结构,它用于标示Class的时候,就是CLSID,用于标示接口的时候,就是IID。 比如接口INSSBuffer有一个表示它的GUID:E1CD3524_11D2_9
2008-07-04 21:43:00
512
原创 C#笔记3
1.C#中也有抽象类,用abstract修饰,里面含有用abstract修饰的方法:abstract class A{ public abstract void F();}abstract class B: A{ public void G() {}}class C: B{ public overrid
2008-07-04 21:32:00
439
原创 FrameWnd,View和Docment的手工创建
以下为MDI下,FrameWnd,View和Docment的手工创建的过程,首先,框架在InitInstance中把主框架创建出来了,并把需要的文档模板用成员变量保存了起来,用户点击主框架中的新建菜单: 1.修改消息映射表中对ID_FILE_NEW的响应为本类的OnFileNew(默认是父类的OnFileNew)2.建立OnFileNew消息函数,下面的操作都在OnFileNew中进行
2008-06-29 09:41:00
1604
原创 文档视图相关类的联系
CWinApp 1.保护成员CDocManager *m_pDocManager,指向一个文档管理对象,CWinApp很多对文档视图的操作都是调用这个对象的方法 2.GetFirstDocTemplatePosition和GetNextDocTemplate用来遍历所有的文档模板,实际是掉用CDocManager的此方法 3.AddDocTemp
2008-06-29 09:18:00
673
原创 动态改变鼠标光标
1.相应WM_SETCURSOR消息,在响应函数OnSetCursor中改变光标,鼠标在窗口中移动时都会发送这个消息 BOOL CFGERWTFEWTFView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message){ // TODO: 在此添加消息处理程序代码和/或调用默认值 SetCursor(AfxGetApp()->Load
2008-06-29 08:57:00
936
原创 MFC消息
1.PeekMessage和GetMessage不同:区别一:peekmessage不管消息队列里有没有消息都会马上返回,有消息返回消息,没消息返回空值,getmessage等待到有消息的时候才返回,区别二:peekmessage可以根据参数决定是否将消息保留在队列中,PM_NOREMOVE:该参数指示保留消息PM_REMOVE:该参数指示移去消息而getmessa
2008-06-27 22:36:00
381
原创 程序窗口消亡过程
1.点击右上角的关闭按钮->发送WM_CLOSE-》调用DefWindowProc,进行一些清理操作(如果没有映射WM_CLOSE消息的话,如果映射了,调用OnClose清理,CWnd的OnClose也会调用DefWindowProc进行清理操作)-》调用DestoryWindow-》发出WM_DESTORY-》调用PostQuitMessage-》发出WM_QUIT(仅用于结束消息循环)2.
2008-06-26 23:42:00
421
原创 MSXML4操作
1.用#import 引入msxml4,#import是COM专用,他是把COM的type library转成c++能用的头文件2.IXMLDomDocument2Ptr pXMLDoc:代表整个DOM文档3.pXMLDoc调用CreateInstace初始化4.pXMLDoc调用Load把XML文件装载进来5.MSXML2::IXMLDomNodePtr pXMLNode:代
2008-06-26 22:08:00
1299
原创 进程通讯1----WM_COPYDATA消息和自定义消息
使用粘剪板即在线程之间发送WM_COPYDATA消息,前提是: 1,知道接收消息进程的句柄。 2,接收消息进程重载了WM_COPYDATA消息映射,能对其做出反应(否则不是发送端自作多情了?) 获得句柄的方法,最简单的方法就是使用FindWindow,找窗口类名,或者标题名,如果你觉得这样不把握,那就利用SetProp给窗口做个记号。 发送端代码
2008-06-25 22:05:00
1144
原创 MFC框架流程图
1.注册窗口时会选择六种窗口中的一种注册。2.AfxWinInit初始化theApp中的各种成员,如m_nCmdShow,m_hInstance等,AfxInitThread初始化线程。3.修改窗口的各种参数,重载虚函数PreCreateWindow,修改传入的窗口结构体即可。 file="/Best4cUserFiles/20080624/207816_121426887
2008-06-24 08:36:00
1722
原创 代码:查找子窗口
1.一个窗口的标题就是主窗口显示时左上角的窗口名,用GetWindowText获取;一个窗口的类名是注册这个窗口时的窗口类名,用GetClassName获取。2.MFC在preCreateWindow中注册窗口类,根据窗口类型不同注册6个窗口类中的一个,每个窗口类名固定,如: CWnd注册一个名为_AfxWnd的类,CFrameWnd注册一个_afxWndFrameOrView,CM
2008-06-23 23:53:00
3148
1
原创 窗口位置相关的函数和概念
1.FindWindow 函数原型: HWND FindWindow ( LPCTSTR lpClassName, LPCTSTR lpWindowName ); 一般把lpClassName置为NULL,用lpWindowName查找,查找成功后返回窗口句柄,如果多个窗口的名称都 是 lpWindowName,
2008-06-23 22:03:00
822
原创 命令消息路由
一般消息和控件都会沿着父类或父窗一直向上传递,但是命令消息会有一个算法进行路由,路由图见下: 1.从View开始查看是否有处理函数,而后一旦有处理函数就会终止流动2.到CWinApp后,调用默认的OnCmdMsg(没有重写时,调用的是CCmdTarget的此方法),它再整个消息映射表中找次消息的映射函数,如果找到就调用此映射函数。4.自定义的类,只要继承自CCmdTarge
2008-06-23 08:32:00
483
原创 网络知识笔记2
1.传输层:提供数据的可靠或不可靠传输。(TCP,UDP) 2.TCP/IP分层:链路层->网络层(IP层)->传输层->应用层 3.UDP发送的数据报,每个数据报有“消息保护边界”,一次收发数据报不会跨越边界,如发送方发送大小为20,40,80三个包,发送方会依次发这三个包,大小不改变,接受方也是按发送的大小依次接收(哪怕三个报都同时到达了接受方),TCP是面向流的协议,它发送和接受的都
2008-06-23 08:04:00
472
原创 网络知识笔记1
1.主机号全0代表整个网络,主机号全1代表广播地址,不能给单个主机配置这样的IP。2.0.0.0.0代表所有主机,在配置路由时可用其配置默认路由,即其它路由不能走时会选择它。RARP协议就是利用了0.0.0.0这个IP地址,因为RARP之前,主机不知道自己的IP地址 0.0.0.0 0.0.0.0 192.168.1.2(下一跳) 192.168.1.101(从路由器的这个口出
2008-06-23 08:02:00
549
原创 _beginthreadex、CreateThread、AfxBeginThread的选择
1. Create/EndThread是Win32方法开始/结束一个线程 _beginthreadx/_endthreadex是C RunTime方式开始/结束一个线程 AfxBeginThread在MFC中开始/结束一个线程2.直接在CreateThread API创建的线程中使用sprintf,malloc,strcat等涉及CRT存储堆操作的CRT库函数是很危险的,容易造成
2008-06-14 01:00:00
2865
1
原创 C Run-Time Libraries 和编译选项的关系
以下各个库都包含了C Run-Time Libraries functions,他们的区别和编译选项以及打开的预编译开关如下: C run-time library (without iostream or standard C++ library) Characteristics
2008-06-14 00:39:00
644
原创 多线程笔记1
1.如果不额外开设线程,消息循环和消息处理函数在一个线程里执行2.ExitThread介绍线程本身:void ExitThread(DWORD dwExitCode);Parameters:dwExitCode [in] Exit code for the calling thread. Use the GetExitCodeThread function to retrieve
2008-06-14 00:13:00
459
原创 OnCreated和OnInitDialog
OnCreated的时候窗口还没有完全建立,你可以给成员变量赋值,也可以修改窗口的基本内容比如风格,但是不能对窗口控件操作,因为窗口还没有建立。 OnInitDialog的时候窗口已经建立,你可以移动窗口,修改风格等等,也可以给成员变量赋值,这时候窗口已经创建好,只差显示了。
2008-06-13 23:39:00
812
原创 OnIdle:MFC空闲处理
当没有任何 Windows 消息正在被处理时,框架调用 CWinApp 的成员函数 OnIdle(如“MFC 库参考”中所述)。重写 OnIdle 以执行后台任务。默认版本更新用户界面对象(如工具栏按钮)的状态,并对框架在操作期间创建的临时对象执行清理工作。下图阐释了在队列中没有任何消息时消息循环调用 OnIdle 的方式。消息循环代码:int CWinThread::Run(
2008-06-13 23:33:00
4000
转载 PeekMessage
该函数为一个消息检查线程消息队列,并将该消息(如果存在)放于指定的结构。 函数原型:BOOL PeekMessage(LPMSG IpMsg,HWND hWnd,UINT wMSGfilterMin,UINT wMsgFilterMax,UINT wRemoveMsg); 参数: lpMsg:接收消息信息的MSG结构指针。 hWnd:其消息被检查的窗口的句柄。
2008-06-13 09:12:00
511
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人