1、CColorDialog为MFC的颜色选择对话框。
2、CFontDialog为MFC的字体选择对话框。
3、CBrush、CPen、CFont、CBitmap等GDI对象都派生于CGdiObject类,要释放GDI对象先前关联的资源可以调用CGdiObject::DeleteObject()函数;要判断GDI对象是否已经于某个资源相关联了,可以通过判断CGdiObject的数据成员m_hObject来实现。
4、当CEdit控件上的文本发生改变时,它会向其父窗口发送EN_CHANGE通知消息(它自己则会收到=EN_CHANGE反射消息)。在对话框资源上右击CEdit控件,选择“添加事件处理程序”,消息类型选择EN_CHANGE,类列表选择对话框类,可以为对话框添加EN_CHANGE消息事件处理程序。
类似的,当CButton控件被点击时,它会向其父窗口发送BN_CLICKED消息(它自己则会收到=BN_CLICKED反射消息),故为按钮添加“单击”事件处理程序应选择BN_CLICKED消息类型。
5、WM_CTLCOLOR消息对应响应函数原型:
afx_msg HBRUSH OnCtlColor( CDC* pDC, CWnd* pWnd, UINT nCtlColor );pDC为要绘制的当前控件的上下文的指针。
pWnd为要绘制的当前控件的指针。
nCtlColor为要绘制的控件的类型,可以为以下值:
-
CTLCOLOR_BTN Button control(按钮控件)
-
CTLCOLOR_DLG Dialog box(对话框)
-
CTLCOLOR_EDIT Edit control(编辑框控件)
-
CTLCOLOR_LISTBOX List-box control(列表框控件)
-
CTLCOLOR_MSGBOX Message box(消息框控件)
-
CTLCOLOR_SCROLLBAR Scroll-bar control(滚动条控件)
-
CTLCOLOR_STATIC Static control(静态文本控件)
HBRUSH CDlgDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: 在此更改 DC 的任何属性
// TODO: 如果默认的不是所需画笔,则返回另一个画笔
<strong>//return hbr;
static CBrush brush(RGB(0,0,255));
return brush;//CBrush重载了HBRUSH操作符,故可以返回CBrush类型</strong>
}
如果想要改变指定控件的背景颜色,可以通过第二个参数pWnd调用GetDlgCtrlID()获得当前控件的ID;如果要改变控件的字体颜色则可以使用第一个参数控件的上下文调用SetTextColor()设置控件的字体颜色;需要注意的是如果要改变单行编辑框控件的背景颜色,除了返回设置的画刷外,还应调用SetBkColor()设置编辑控件的背景颜色。eg:
HBRUSH CDlgDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: 在此更改 DC 的任何属性
// TODO: 如果默认的不是所需画笔,则返回另一个画笔
if(pWnd->GetDlgCtrlID() == IDC_EDIT1)
{
pDC->SetTextColor(RGB(255,0,0));
pDC->SetBkColor(RGB(0,0,255));
static CBrush brush(RGB(0,0,255));
return brush;
}
return hbr;
}
如果是按钮控件的话,则改变其背景颜色和文本颜色应该重载按钮类的DrawItem()函数,并设置自绘属性,需要注意的是在DrawItem返回前,一定要恢复lpDrawItemStruct->pDC中原有对象,如果改变了的话。 函数原型:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);参数 lpDrawItemStruct 指向的结构体包含将要绘制的信息和要绘制的类型:
typedef struct tagDRAWITEMSTRUCT { UINT CtlType; UINT CtlID; UINT itemID; UINT itemAction; UINT itemState; HWND hwndItem; HDC hDC; RECT rcItem; DWORD itemData; } DRAWITEMSTRUCT;CtlType:控件类型,为以下值之一:ODT_BUTTON 自绘制按钮
ODT_COMBOBOX 自绘制组合框
ODT_LISTBOX 自绘制列表框
ODT_MENU 自绘制菜单项
ODT_LISTVIEW 自绘制列表视
ODT_STATIC 自绘制静态控件
ODT_TAB Tab控件
CtlID:控件ID,对于菜单项无需使用。
itemID:菜单项ID或列表框、组合框中某项的索引值,对于一个空的列表框或组合框,该成员的值为-1。
itemAction:绘制动作,可以为以下值之一或组合:ODA_DRAWENTIRE 整个控件都需被绘制
ODA_FOCUS 控件需要获得或失去焦点时被绘制
ODA_SELECT 控件需要在被选中时绘制
itemState:当前绘制完成后的,所绘项的可见状态,有以下几种取值:
ODS_CHECKED 如果菜单项将被选中,该值被设置(只对菜单项有效)
ODS_DISABLED 如果绘制项将被禁止,该值被设置ODS_FOCUS 如果绘制项需要输入焦点,该值被设置
ODS_GRAYED 如果绘制项需要被灰色显示,则该值被设置
ODS_SELECTED 如果绘制项需要被设置为选中状态,则该值被设置
ODS_COMBOBOXEDIT 在自绘制组合框中只绘制选择区域
ODS_DEFAULT 自绘制项为默认项,表示当前控件处于默认状态;
hwndItem:指定了组合框、列表框和按钮等自绘制控件的窗口句柄,如果为菜单项,则为示包含该菜单项的菜单句柄。
hDC:绘制操作所使用的设备环境。
rcItem:将被绘制的矩形区域,这个矩形区域就是上面hDC的作用范围。系统会自动裁剪组合框、列表框或按钮等控件的自绘制区域以外的部分。也就是说rcItem中的坐标点(0,0)指的就是控件的左上角。但是系统不裁剪菜单项,所以在绘制菜单项的时候,必须先通过一定的换算得到该菜单项的位置,以保证绘制操作在我们希望的区域中进行。
itemData:对于菜单项,该成员的取值可以是由CMenu::AppendMenu、CMenu::InsertMenu或者CMenu::ModifyMenu等函数传递给菜单的值;对于列表框或组合框,该成员的值可以为由ComboBox::AddString、CComboBox::InsertString、CListBox::AddString或者CListBox::InsertString等传递给控件的值;如果ctlType是ODT_BUTTON或ODT_STATIC,itemData则为0。
eg:改变按钮的背景颜色和文本颜色:
void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: 添加您的代码以绘制指定项
//绘制按钮框架
UINT uStyle = DFCS_BUTTONPUSH;
// This code only works with buttons.
ASSERT(lpDrawItemStruct->CtlType == ODT_BUTTON);
// If drawing selected, add the pushed style to DrawFrameControl.
if (lpDrawItemStruct->itemState & ODS_SELECTED)
uStyle |= DFCS_PUSHED;
// Draw the button frame.
::DrawFrameControl(lpDrawItemStruct->hDC, &lpDrawItemStruct->rcItem, DFC_BUTTON, uStyle);
CDC dc;
dc.Attach(lpDrawItemStruct->hDC);
//设置按钮背景颜色
CBrush brush(RGB(0,255,0));
dc.FillRect(&lpDrawItemStruct->rcItem,&brush);
//设置按钮文本颜色
CString strText;
GetWindowText(strText);
COLORREF clr_tx = dc.SetTextColor(RGB(255,0,0));
int bkMode_old = dc.SetBkMode(TRANSPARENT);
dc.DrawText(strText, strText.GetLength(), &lpDrawItemStruct->rcItem, DT_SINGLELINE|DT_CENTER|DT_VCENTER);
//恢复hDC中原有对象
dc.SetBkMode(bkMode_old);
dc.SetTextColor(clr_tx);
dc.Detach();
}
6、为对话框资源视图上的按钮关联自定义类型的成员变量:例如CMyButton类是从CButton继承而来的类,现在为按钮关联一个CMyButton类型的成员变量:右击按钮—>添加变量—>变量类型选择CMyButton—>勾选控件变量。
7、显示位图
■pSrcDC指向源设备上下文对象。
■xSrc和ySrc指定源矩形区域左上角的x坐标和y坐标。
要在窗口中显示一张位图,首先向工程资源中插入一张位图,ID设为IDB_BITMAP1。
窗口的绘制包含两个过程:先擦除背景,然后再对窗口重新进行绘制。当擦除窗口背景时,会发送WM_ERASEBKGND消息,故可以在视类窗口的WM_ERASEBKGND消息响应函数中实现位图的显示,同时应屏蔽掉擦除窗口背景的操作:
BOOL CtestView::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//创建位图对象
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
//创建与当前DC兼容的DC
CDC dcCompatible;
dcCompatible.CreateCompatibleDC(pDC);
//将位图对象选入到兼容DC中
dcCompatible.SelectObject(&bitmap);
//将兼容DC中位图画到当前DC中
CRect rect;
GetClientRect(&rect);
pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &dcCompatible, 0, 0, SRCCOPY);
return TRUE;
//return CView::OnEraseBkgnd(pDC);//屏蔽擦除窗口背景
}
CDC::StretchBlt()函数与BitBlt()功能相似,不同的是如果目标矩形区域比源矩形区域大或小,则BitBlt()不会对源矩形区域进行拉伸或压缩, StretchBlt()则多了两个参数来指示源矩形区域大小,在复制时可以自动拉伸和压缩源像素区域,以适合目的矩形区域的尺寸。在当前程序中,源矩形区域的大小即为选入的位图对象的宽度和高度,位图对象的宽度和高度可以通过调用CBitmap::GetBitmap(BITMAP* pBitMap)获得,该函数返回位图对象的相关信息到一个BITMAP结构中,其中包括位图的宽度和高度:
typedef struct tagBITMAP
{
LONG bmType;
LONG bmWidth; //位图宽度
LONG bmHeight;//位图高度
LONG bmWidthBytes;
WORD bmPlanes;
WORD bmBitsPixel;
LPVOID bmBits;
} BITMAP, *PBITMAP, NEAR *NPBITMAP, FAR *LPBITMAP;
BOOL CtestView::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//创建位图对象
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
BITMAP bmp;
bitmap.GetBitmap(&bmp);
//创建兼容DC
CDC dcCompatible;
dcCompatible.CreateCompatibleDC(pDC);
//将位图对象选入到兼容DC中
dcCompatible.SelectObject(&bitmap);
//将兼容DC中位图画到当前DC中
CRect rect;
GetClientRect(&rect);
pDC->StretchBlt(0, 0, rect.Width(), rect.Height(), &dcCompatible, 0, 0,
bmp.bmWidth, bmp.bmHeight, SRCCOPY);
return TRUE;
//return CView::OnEraseBkgnd(pDC);
}
其它需要注意的地方: