获取对话框当前cfont_MFC设置对话框、字体对话框、颜色对话框(转)
一、繪圖
新建一個工程Graphic。添加一個菜單“繪圖”,在這個菜單中添加四個菜單項,分別為點(IDM_DOT)、直線(IDM_LINE)、矩形(IDM_RECTANGLE)和橢圓(IDM_ELLIPSE)。分別為這四個菜單項添加命令響應。在每個命令響應函數中保存用戶的選擇,定義成員變量UINT
m_nDrawType
private保存用戶的選擇。在CGraphicView的構造方法中初始化m_nDrawType=0。在OnDot、OnLine、OnRectangle和OnEllipse響應函數中分別設置這個成員變量的值為1、2、3、4。分別捕獲鼠標左鍵按下和松開的消息WM_LBUTTONDOWN和WM_LBUTTONUP。在WM_LBUTTONDOWN中將鼠標按下的這個點保存,在View類中添加成員變量CPoint
m_ptOrgin
private,在構造函數中初始化為0。在OnButtonDownh函數總保存這個點到成員變量中m_ptOrigin=point。
鼠標松開的響應函數ONBUTTONUP中代碼如下:
CClientDC dc(this);
CPen pen(PS_SOLID,1,RGB(255,0,0));
dc.SelectObject(&pen);
CBrush
*pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
dc.SelectObject(pBrush);
switch(m_nDrawType)
{
case 1:
dc.SetPixel(point,RGB(255,0,0));
break;
case 2:
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
break;
case 3:
dc.Rectangle(CRect(m_ptOrigin,point));
break;
case 4:
dc.Ellipse(CRect(m_ptOrigin,point));
break;
}
二、設置對話框
1、設置線寬
插入一個對話框:IDI_DLG_SETTING
setting。在對話框上添加一個靜態文本框:線寬,一個編輯框:IDC_LINE_WIDTH。雙擊對話框創建一個對話框的類:CSettingDlg。點右鍵給編輯框控件關聯成員變量:m_nLineWidth
UINT。增加設置菜單項:IDM_SETTING 設置,給菜單項添加命令響應OnSetting,選擇view類。
響應函數中的代碼如下:
CSettingDlg dlg;
dlg.DoModal();
在view類中增加保存對話框中設置的線寬的成員變量:UINT m_nLineWidth
private。在構造函數中初始化為0。
設置菜單項響應函數OnSetting的代碼修改如下:
CSettingDlg dlg;
dlg.m_nLineWidth=m_nLineWidth;
if(IDOK==dlg.Domal())
{
m_nLineWidth=dlg.m_nLineWidth;
}
將WM_LBUTTONUP響應函數中的畫筆修改為:CPen
pen(PS_SOLID,m_nLineWidth,RGB(255,0,0);
2、設置線型
在對話框中放置一個組框和三個單選按鈕,三個單選按鈕名稱分別為:實線、虛線和點線。第一個勾選Group。給單選按鈕關聯成員變量:m_nLineStyle
int。在view類中增加成員變量int m_nLineStyle
private。初始化為0。在OnSetting響應函數中當用戶點擊Ok的時候保存起來:
CSettingDlg dlg;
dlg.m_nLineWidth=m_nLineWidth;
dlg.m_nLineStyle=m_nLineStyle;
if(IDOK==dlg.Domal())
{
m_nLineWidth=dlg.m_nLineWidth;
m_nLineStyle=dlg.m_nLineStyle;
}
將WM_LBUTTONUP響應函數中的畫筆修改為:CPen
pen(m_nLineStyle,m_nLineWidth,RGB(255,0,0);不需要再用switch
case語句,因為三種畫筆的定義和我們的定義的值是一致的。
三、顏色對話框
增加菜單項:IDM_COLOR 顏色。添加命令響應:OnColor。在view類中增加成員變量:COLORREF m_clr
private,用來保存用戶的顏色選擇,在構造方法中初始化m_clr=RGB(255,0,0)。
void CGraphicView::OnColor()
{
CColorDialog dlg;
dlg.m_cc.Flags | =CC_RGBINIT;
dlg.m_cc.rgbResult=m_clr;//記住用戶的顏色選擇
if(IDOK==dlg.DoModal())
{
m_clr=dlg.m_cc.rgbResult;
}
}
四、字體對話框
添加菜單項:IDM_FONT 字體。增加響應函數OnFont。增加成員變量CFont m_font
private。增加保存字體名字的成員變量CString m_strFontName?private,并初始化。
void CGraphicView::OnFont()
{
CFontDialog dlg;
if(IDOK==dlg.DoModal())
{
if(m_font.m_hObject)
m_font.DeleteObject();
m_font.CreateFontIndirect(dlg.m_cf.lpLogFont);
m_strFontName=dlg.m_cf.lpLogFont->lfFaceName;
Invalidate();
}
}
在OnDraw響應函數中加入如下代碼:
CFont *oldFont=pDC->SelectObject(&m_font);
pDC->TextOut(0,0,m_strFontName);
pDC->SelectObject(oldFont);
五、示例功能
在設置對話框中增加一個組框:IDC_SAMPLE
示例。添加編輯框消息響應函數EN_CHANGE,三個單選按鈕分別添加消息響應函數BN_CLICKED。在四個函數中調用:Invalidate();
在CSettingDlg類中點右鍵,選擇WM_PAINT。
void CSettingDlg::OnPaint()
{
CPaintDC dc(this);
UpdateData();
CPen pen(m_nLineStyle,m_nLineWidth,RGB(255,0,0));
dc.SelectObject(&pen);
CRect rect;
GetDlgItem(IDC_SAMPLE)->GetWindowRect(&rect);//GetWindowRect獲得的是屏幕的坐標
ScreenToClient(&rect);//將屏幕坐標轉換為對話框坐標。
dc.MoveTo(rect.left+20,rect.top+rect.Height()/2);
dc.LineTo(rect.right-20,rect.top+rect.Height()/2);
}
設置示例顏色,在CSettingDlg類中增加成員變量:COLORREF m_clr
public,并初始化m_ctr=RGB(255,0,0)。在View類的OnSetting函數中將View類保存的顏色值傳遞給對話框的成員變量:dlg.m_clr=m_clr;將OnPaint函數中的畫筆修改:CPen
pen(m_nLineStyle,m_nLineWidth,m_clr);
六、改變對話框背景色,對話框中控件的背景色
1、改變對話框背景
參考:WM_CTLCOLOR (OnCtlColor)
在CSettingDlg類中添加響應函數OnCtlColor。添加成員變量:CBrush m_brush
private,并初始化:m_brush.CreateSolidBrush(RGB(0,0,255))。在OnCtrColor函數中加入代碼:return
m_brush;
改變組框背景色,設置組框ID:IDC_LINE_STYLE。OnCtlColor會被調用多次。
HBRUSH CSettingDlg::OnCtlColor(CDC *pDC,CWnd *pWnd,UINT
nCtlColor)
{
HBRUSH hbr=CDialog::OnCtlColor(pDC,pWnd,nCtlColor);
if(pWnd->GetDlgCtlId()==IDC_LINE_STYLE)
{
pDC->SetTextColor(RGB(255,0,0));
pDC->SetBkMode(TRANSPARENT);
return m_brush;
}
if(pWnd->GetDlgCtlId()==IDC_LINE_WIDTH)
{
pDC->SetTextColor(RGB(255,0,0));
pDC->SetBkColor(RGB(0,0,255));
return m_brush;
}
return hbr;
}
2、對話框中的文本按照我們設定的字體顯示
在設置對話框中增加一個文本框:IDC_TEXT 程序員。在CSettingDlg類中增加成員變量:CFont m_font
private,初始化:m_font.CreatePointFont(200,"華文行楷");在OnCtlColor函數中添加以下代碼:
if(pWnd->GetDlgCtlId()==IDC_TEXT)
{
pDC->SelectObject(&m_font);
}
3、改變OK按鈕的文本色
參考:CBtton;;DrawItem
添加新類:CTestBtn ,基類選擇CButton。CTestBtn->Add virtual
function->DrawItem
void CTestBtn::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
UINT uStyle=DFCS_BUTTONPUSH;
ASSERT(lpDrawItemStruct->CtlType==ODT_BUTTON);
if(lpDrawItemStruct->itemState&ODS_SELECTED)
uStyle | =DFCS_PUSHED;
::DrawFrameControl(lpDrawItemStruct->hDC,&lpDrawItemStruct->rcItem,DFC_BUTTON,uStyel);
CString strText;
GetWindowText(strText);
COLORREF
crOldColor=::SetTextColor(lpDrawItemStruct->hDC,RGB(255,0,0));
::DrawText(lpDrawItemStruct->hDC,strText,strText.GetLength(),&lpDrawItemStruct->rcItem,DT_SINGLELINE
| DT_VCENTER | DT_CENTER);
::SetTextColor(lpDrawItemStruct->hDC,crOldColor);
}
為設置對話框的ok按鈕關聯成員變量m_btnTest CTestBtn。設置對話框的OK按鈕的屬性styles中的Owner
Draw勾選。
七、如何在窗口中顯示位圖
1、創建位圖
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
2、創建兼容DC
CDC dcCompatible;
dcCompatible.CreateCompatibleDC(pDC);
3、將位圖選到兼容DC中
dcCompatible.SelectObject(&bitmap);
4、將兼容DC中的位圖貼到當前DC中。
pDC->BitBlt(rect.left,rect.top,rect.Width(),
rect.Height(),&dcCompatible,0,0,SRCCOPY);
位圖背景可以在窗口擦除OnEraseBkgnd和OnDraw響應函數中實現。
擦除窗口,增加WM_ERASE響應函數。
BOOL CGraphicView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here
and/or call default
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
BITMAP bmp;
bitmap.GetBitmap(&bmp);
CDC dcCompatible;
dcCompatible.CreateCompatibleDC(pDC);
dcCompatible.SelectObject(&bitmap);
CRect rect;
GetClientRect(&rect);
//
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY);
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,
0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
return TRUE;
// return CView::OnEraseBkgnd(pDC);
}
總結
以上是生活随笔為你收集整理的获取对话框当前cfont_MFC设置对话框、字体对话框、颜色对话框(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: lower_bound,upper_bo
- 下一篇: React中自定义高阶组件的应用(HOC