vc笔记
1.
句柄(HANDLE)的东西。可以这样去理解句柄,Windows程序中产生的任何资源(要占用某一块或大或小的内存),如图标,光标,窗口,应用程序的实例(已加载到内存运行中的程序)。操作系统每产生一个这样的资源时,都要将它们放入相应的内存,并为这些内存指定一个唯一的标识号,这个标识号即该资源的句柄。
2.创建光标
CClientDC dc(this);
CFont font;
font.CreatePointFont(200,"宋体");
dc.SetTextColor(RGB(0,0,255));
dc.SelectObject(&font);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);
ShowCaret();
VC++深入详解 2007.1.16
第一章: windows程序内部运行机制
1. HWND 类型标识窗口。HINSTANCE 实例句柄.
2. typeded struct _WNDCLASS {}
位或操作: style = CS_HREDRAW|CS_VREDRAW;
取反~:
与&:
去掉先前style 的CS_VREDRAW: style=style&~CS_VREDRAW;
3:回调函数: 不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外一方调用,用于对该事件或条件进行响应。
实现机制:
*1: 定义一个回调函数.
*2: 提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者。
*3: 当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理。
WNDPROC的定义(它被定义为指向窗口过程函数指针类型,格式必须与WNDPROC相同。
typedef LRESULT (CALLBACK* WNDPROC)(HWND,UINT,WPARAM,LPARAM);
WINDOWS程序中,回调函数必须遵循_stdcall 调用约定, 所以要使用CALLBACK.
4.HICON LoadIcon(HINSTANCE ,LPCTSTR)
LPCTSTR: CONST CHAR * 指向字符常量的指针。 用MAKEINTRESOURCE转换图标ID(整数).
5. GetMessage 除WM_QUIT外返回非0,WM_QUIT返回0,出现错误返回-1.
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg); //虚拟键消息转为字符消息,投递到调用线程的消息队列。
DispatchMessage(&msg);
}
非0即为真
MSDN:
BOOL bRet;
while((bRet = GetMessage(&msg,NULL,0,0))!=0)
{
if(bRet==-1)
{
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
第二章 C++
1. 结构体默认情况下,其成员是公有(Public)的,类默认情况下,其成员是私有的。
2.多态: 在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。
c++的多态性是由虚函数来实现的,而不是纯虚函数,在子类中如果有对基类虚函数的覆盖定义,无论该覆盖定义是否有virtual关键字,都是虚函数。
3.纯虚函数:
virtual void fun()=0
在派生类中必须完全实现基类的纯虚函数。
第四章:
1.SDK画线
HDC dc;
dc = ::GetDC(m_hWnd);
MoveToEx(dc,m_pt.x,m_pt.y,NULL);
LineTo(dc,point.x,point.y);
::ReleaseDC(m_hWnd,hdc);
MFC 画线
CDC* pdc = GetDC();
pdc->MoveTo(m_pt.x,m_pt.y);
pdc->LineTo(point.x,point.y);
ReleaseDC(pdc);
CClientDC 类画线 //可画到工具栏
CClientDC dc(GetParent());
dc.MoveTo(m_pt.x,m_pt.y);
dc.LineTo(point.x,point.y);
CWindowDC 类画线 //可画到工具栏,菜单栏
CWindowDC dc(GetParent());
dc.MoveTo(m_pt.x,m_pt.y);
dc.LineTo(point.x,point.y);
//在桌面上画线
CWindowDC dc(GetDesktopWindow());
dc.MoveTo(m_pt.x,m_pt.y);
dc.LineTo(point.x,point.y);
2.彩色线条
CPen pen(PS_SOLID,1,RGB(255,0,255));
CClientDC dc(this);
CPen *pens = dc.SelectObject(&pen);
dc.MoveTo(m_pt.x,m_pt.y);
dc.LineTo(point.x,point.y);
dc.SelectObject(pens);
PS_DASH:画笔的宽度小于等于1时,才有效。
3.
简单笔刷
CBrush brush(RGB(255,0,255));
CClientDC dc(this);
dc.FillRect(CRect(m_pt,point),&brush);
位图刷
CBitmap bmp;
bmp.LoadBitmap(IDR_FFFTYPE);
CBrush brush(&bmp);
CClientDC dc(this);
dc.FillRect(CRect(m_pt,point),&brush);
透明刷
CClientDC dc(this);
CBrush *pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
CBrush *pOldBrush = dc.SelectObject(pBrush);
dc.Rectangle(CRect(m_pt,point));
dc.SelectObject(pOldBrush);
画刷句柄转换成画刷对象 FromHandle
4.静态成员函数和静态成员变量属于类本身,在类加载的时候,即为它们分配了空间,所以可以通过类名::函数名 或类名:变量名来访问,而非静态成员函数和非静态成员属于对象的方法和数据,也就是应该首先产生类的对象,然后通过类的对象去引用。
在静态成员函数中是不能调用非静态成员的,包括非静态成员函数和非静态成员变量。
第五章:
1.文本插入符
CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);
ShowCaret();
BMP插入符
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);
CreateCaret(&bmp);
ShowCaret();
2.路径P159
对GetTextMetrics函数来说,它获得的是设备描述表中当前字体的度量信息,而GetTextExtent函数则是
获得某个特定的字符串在窗口中显示时所占据的宽度和高度。
第六章:
1.响应菜单项命令的顺序依次是:视类,文档类,框架类,应用程序类。