加载中...
VC对话框类
发表于:2009-10-30 | 分类: 电脑与软件使用
字数统计: 3k | 阅读时长: 13分钟 | 阅读量:

checked

if(pBtn->GetCheck ()) {

最大化最小化及滚动

对整个对话框设置属性里面就有的! 一起动就最大化 oninitial中 ShowWindow(SW_MAXIMIZE) 滚动 添加滚动条 选中边框是属性是调整大小 响应滚动消息 To create a resizeable dialog box with a vertical scroll bar, perform the following steps:

Use App Wizard to create a Microsoft Foundation Classes (MFC) dialog-based application.

In Resource Editor, add some controls to the dialog resource template, select Vertical Scroll in the properties of the dialog box, and choose Resizing as the Border style.

Add the following protected member variables to your dialog class:

int m_nCurHeight;
int m_nScrollPos;
CRect m_rect;

Use m_nScrollPos to store the current vertical scroll position. Use m_nCurHeight to store the current height of the dialog box, and to handle the scrolling in the OnVScroll method.

To get the original window size, add the following line to the OnInitDialog method:

GetWindowRect(m_rect);
m_nScrollPos = 0;

Add a message handler to the OnSize method for the WM_SIZE message to set the scroll bar range. Set the range to 0 if the size is increased to more than the original size.

void CTestDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
// TODO: Add your message handler code here.
m_nCurHeight = cy;
int nScrollMax;
if (cy < m_rect.Height())
{
nScrollMax = m_rect.Height() - cy;
}
else
nScrollMax = 0;
SCROLLINFO si;
si.cbSize = sizeof(SCROLLINFO);
si.fMask = SIF_ALL; // SIF_ALL = SIF_PAGE SIF_RANGE SIF_POS;
si.nMin = 0;
si.nMax = nScrollMax;
si.nPage = si.nMax/10;
si.nPos = 0;
SetScrollInfo(SB_VERT, &si, TRUE);
}

Add a message handler for the WM_VSCROLL message to the OnVScroll method:

void CTestDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default.
int nDelta;
int nMaxPos = m_rect.Height() - m_nCurHeight;
switch (nSBCode)
{
case SB_LINEDOWN:
if (m_nScrollPos >= nMaxPos)
return;
nDelta = min(nMaxPos/100,nMaxPos-m_nScrollPos);
break;
case SB_LINEUP:
if (m_nScrollPos <= 0)
return;
nDelta = -min(nMaxPos/100,m_nScrollPos);
break;
case SB_PAGEDOWN:
if (m_nScrollPos >= nMaxPos)
return;
nDelta = min(nMaxPos/10,nMaxPos-m_nScrollPos);
break;
case SB_THUMBPOSITION:
nDelta = (int)nPos - m_nScrollPos;
break;
case SB_PAGEUP:
if (m_nScrollPos <= 0)
return;
nDelta = -min(nMaxPos/10,m_nScrollPos);
break;
default:
return;
}
m_nScrollPos += nDelta;
SetScrollPos(SB_VERT,m_nScrollPos,TRUE);
ScrollWindow(0,-nDelta);
CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}

一句话设置颜色

-— 方法一:调用CWinApp类的成员函数SetDialogBkColor来实现。 注意放的位置: /先于DoModal()调用,将对话框设置为蓝色背景、红色文本 SetDialogBkColor(RGB(0,0,255),RGB(255,0,0)); int nResponse = dlg.DoModal(); … } —- 编译并运行,此时对话框的背景色和文本色已发生了改变。值得注意的 是:在调用DoModal()之前必须先调用SetDialogBkColor,且此方法是将改变 应用程序中所有的对话框颜色,并不能针对某一个指定的对话框。 比如 SetDialogBkColor(RGB(188,197,230),RGB(13,125,188)); 下面是详细的编程过程: 1. 新建项目:在VC6中用MFC新建一个基于对话框的BgcolorDemo项目,接受所有缺省选项即可; 2.写入这条语句就成了:在 BgColorDemo.cpp文件中找到 BOOL CBgColorDemoApp::InitInstance()函数,在如下位置加入SetDialogBkColor设置。 BOOL CBgColorDemoApp::InitInstance() { AfxEnableControlContainer(); // Standard initialization // If you are not using these features and wish to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you do not need. #ifdef _AFXDLL Enable3dControls(); // Call this when using MFC in a shared DLL #else Enable3dControlsStatic(); // Call this when linking to MFC statically #endif CBgColorDemoDlg dlg; m_pMainWnd = &dlg; //在这里加入背景颜色的设置,就一条语句,多简单, //前一个 RGB设置背景色,第二个RGB设置字体颜色 SetDialogBkColor(RGB(000,204,255), RGB(255, 0,0)); int nResponse = dlg.DoModal(); if (nResponse == IDOK) { // TODO: Place code here to handle when the dialog is // dismissed with OK } else if (nResponse == IDCANCEL) { // TODO: Place code here to handle when the dialog is // dismissed with Cancel } // Since the dialog has been closed, return FALSE so that we exit the // application, rather than start the application’s message pump. return FALSE; } 大功告成,Build -> Run 吧,成了吗?

图标按钮

要重载CButton! 把Bitmap   画到Butoon上! 用CButton,不如用CBitmapButton啦

button加背景图片和变色

void CTransParentDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); CClientDC  dc(this); CDC     memDC; CBitmap    bitmap; BITMAP  bmp; bitmap.LoadBitmap(IDB_BITMAP_BACK); bitmap.GetObject (sizeof(BITMAP),&bmp); memDC.CreateCompatibleDC (&dc); memDC.SelectObject (bitmap); dc.BitBlt (0,0,bmp.bmWidth ,bmp.bmHeight ,&memDC,0,0,SRCCOPY); } }

加背景图片

静态或位图动态图片 如何设置界面颜色部分 ctlColor消息 对话框 FORMVIEW 控 改OnCtlColor方法,得到窗口的pDC,再调用CDC类的SetBkColor、SetTextColor方法 一.静态 在dialog加入 Picture Control组件,改属性type为Bitmap,此时属性里的 image 变为可选,再加入 Bitmap 资源,将 image选为相应的bitmap资源即可! 但是我做了之后是盖住按钮了 1、用图片控件 在对话框中加入Picture控件,属性页中General->Type设为Bitmap, Image中选中相关联的图片资源号。 这样就编译运行,你就会发现它己经可以了。 耶,不对,图片复盖了其它控件!怎么办? 哈哈,这是由于你的Picture控件是后面放上去的。这样它会显示在最上层,所以有些控件看不到了。有两种方法可以解决: (1)、选中所有控件Ctrl+A, 然后取消对图片控件的选择,将其它控件剪切Ctrl+X,再粘帖 Ctrl+C, 编译运行或Ctrl+T看看,是不是可以了? (2)、在.rc文件中找到此对话框的定义,此处以例子中的一对话框为例。 IDD_DLG_USE_STATIC DIALOGEX 0, 0, 266, 201 STYLE DS_MODALFRAME WS_POPUP WS_VISIBLE WS_CAPTION WS_SYSMENU EXSTYLE WS_EX_APPWINDOW CAPTION “DlgUseStatic” FONT 9, “宋体” BEGIN CONTROL     129,IDC_STATIC,”Static”,SS_BITMAP,0,0,266,201 PUSHBUTTON    “取消”,IDCANCEL,210,23,50,14 DEFPUSHBUTTON “确定”,IDOK,210,7,50,14 LTEXT      “这是个通过图片控件来实现Dialog背景的”,IDC_STATIC,13,106,156,8 PUSHBUTTON    “方法二>>”,IDC_BUTTON1,215,104,50,14 END 在BEGIN至END中便是各个控件的定义和先后顺序,你可以随意调整它们的顺序,这样最先的,它将会显示在最底层(即可能被其它控件覆盖)。 2、在WM_PAINT中画图 这是显示图片最常用的方法,各类窗体、控件要加上背景都基本上是在OnPaint中将图片画上。具体做法如下: //从资源中载入图片 CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP1); //得到图片信息 BITMAP bmpInfo; bmp.GetBitmap(&bmpInfo); //在内存中创建一个位图兼容设备 CDC dcMemory; dcMemory.CreateCompatibleDC(&dc); //将图片选入兼容设备 CBitmap *pOldBmp=dcMemory.SelectObject(&bmp); //将兼容设备的内容copy到屏幕设备中,实现真正的Paint dc.BitBlt(0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, &dcMemory, 0, 0, SRCCOPY); //将设备还原 dcMemory.SelectObject(pOldBmp); 这样图片便显示在主对话框上。 特殊处理: 是不是经常有人提到某些加快图形显示、减少闪烁?处理什么WM_ERASEBKGND消息? 确实是这样,应为每个窗体重画时,它先会发WM_ERASEBKGND消息,让窗体用设置好的刷子将窗体需要重画的区域刷一次,然后才会发送 WM_PAINT消息,将需要的再画上去。这样就可以保证不会有残留的图形。但这样就会在短暂的时间内出现灰色背景,如果执行比较慢,就会让人感觉到。因此如果你确定不需要清除原有的背景,那么你就可以在OnEraseBkgnd中直接返回TRUE,或者直接在这里面绘图。 但一定要注意,不擦除背景时弄不好会带来上些麻烦事,源码中有此演示(由于一开始设置为不擦除背景,所以窗体创建时,没有画图的部分将显示为原来屏幕上的图象)。 同时源码中演示了对图片的拉申,实质上通过CDC我们可以对图象进行众多的处理,请参见有观资料或MSDN。 二,动态 OnPaint() if (IsIconic()) { } else { //下面为添加背景 CPaintDC dc(this); CRect rect; GetClientRect(&rect); CDC dcMem; dcMem.CreateCompatibleDC(&dc); CBitmap   bmpBackground; bmpBackground.LoadBitmap(IDB_BITMAP1); BITMAP   bitMap; bmpBackground.GetBitmap(&bitMap); CBitmap   *pbmpOld=dcMem.SelectObject(&bmpBackground); dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitMap.bmWidth,bitMap.bmHeight,SRCCOPY); /* 下面为插入图片 CClientDC   dc(this); CDC mydc; mydc.CreateCompatibleDC(&dc); CBitmap mybitmap; mybitmap.LoadBitmap(IDB_BITMAP1); mydc.SelectObject(mybitmap); dc.BitBlt(10,0,100,100,&mydc,0,0,SRCCOPY); */ } —- 方法一:调用CWinApp类的成员函数SetDialogBkColor来实现。 —- 其中函数的第一个参数指定了背景颜色,第二个参数指定了文本颜色。 下面的例子是将应用程序对话框设置为蓝色背景和红色文本,步骤如下: —- ① 新建一个基于Dialog的MFC AppWizard应用程序ExampleDlg。 —- ② 在CExampleDlgApp ::InitInstance()中添加如下代码: BOOL CExampleDlgApp: : InitInstance ( ) { … CExampleDlgDlg dlg; m_pMainWnd = &dlg; //先于DoModal()调用,将对话框设置为蓝色背景、红色文本 SetDialogBkColor(RGB(0,0,255),RGB(255,0,0)); int nResponse = dlg.DoModal(); … } —- 编译并运行,此时对话框的背景色和文本色已发生了改变。值得注意的 是:在调用DoModal()之前必须先调用SetDialogBkColor,且此方法是将改变 应用程序中所有的对话框颜色,并不能针对某一个指定的对话框。 —- 方法二:重载OnPaint(),即WM_PAINT消息。有关代码如下(以上例工程为准): void CExampleDlgDlg::OnPaint() { if (IsIconic()) … else { CRect rect; CPaintDC dc(this); GetClientRect(rect); dc.FillSolidRect(rect,RGB(0,255,0)); //设置为绿色背景 CDialog::OnPaint(); } —- 方法三:重载OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor), 即WM_CTLCOLOR消息。具体步骤如下(以上例工程为准): —- ①在CExampleDlgDlg的头文件中,添加一CBrush的成员变量: class CExampleDlgDlg : public CDialog { … protected: CBrush m_brush; … }; —- ②在OnInitDialog()函数中添加如下代码: BOOL CExampleDlgDlg::OnInitDialog() { … // TODO: Add extra initialization here m_brush.CreateSolidBrush(RGB(0, 255, 0)); // 生成一绿色刷子 要放在诸如SetWindowText(); ShowWindow(SW_SHOWMAXIMIZED); 等显示函数之前,才能见到绿色画刷的效果 … } —- ③利用ClassWizard重载OnCtlColor(…),即WM_CTLCOLOR消息: HBRUSH CExampleDlgDlg::OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor) { /* ** 这里不必编写任何代码! **下行代码要注释掉 ** HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); */ return m_brush; //返回绿色刷子 } —- 方法四:还是重载OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor), 即WM_CTLCOLOR消息。具体步骤如下(以上例工程为准): —- 步骤①、②同上方法三中的步骤①、②。 —- 步骤③利用ClassWizard重载OnCtlColor(…)(即WM_CTLCOLOR消息)时则有 些不同: HBRUSH CExampleDlgDlg::OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); //在这加一条是否为对话框的判断语句 if(nCtlColor ==CTLCOLOR_DLG) return m_brush; //返回绿色刷子 return hbr; } —- 编译并运行即可。 —- 关于如何改变对话框背景颜色的问题,可能还有很多种不同方法可以实现, 笔者在这仅举出四种常见的方法。其中方法三的编程似乎有点不太规范,方法四则 要比方法三正统些,笔者这样的对比举例是为了拓宽VC编程爱好者特别是初学者的 编程思路,读者可以根据实际情况选用其中的一种。如果再结合《软件报》2000年第 5期中改变对话框上的控件颜色,相信会使您的MFC应用程序”增色”不少。 另外:http://blog.csdn.net/gudulyn/archive/2006/01/03/569083.aspx 设置背景位图: CBitmap m_bmpBackground; m_bmpBackground.LoadBitmap(IDB_BACKGROUND); OnPaint() { CBkDialog::OnPaint(); /* CPaintDC dc(this);      //对话框的dc CDC dcMem; dcMem.CreateCompatibleDC(&dc);     //创建与对话框dc兼容的内存dc CRect rect; GetClientRect(&rect); BITMAP bitMap; m_bmpBackground.GetBitmap(&bitMap); CBitmap *pbmpOld=dcMem.SelectObject(&m_bmpBackground);    //将背景位图选入内存dc中 dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitMap.bmWidth,bitMap.bmHeight,SRCCOPY);     //将内存dc中的位图拉伸显示在对话框的dc中 //dc.BitBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,SRCCOPY); void CMy4272Dlg::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: Add your message handler code here CPaintDC   pDCShow(this); CBitmap   bitmap; //bitmap.Attach(SHLoadDIBitmap(TEXT(“Storage Card\\0408\\002.bmp”))); bitmap.LoadBitmap(IDB_BITMAP1); BITMAP   bmpInfo; bitmap.GetBitmap(&bmpInfo); CDC   bitmapDC; bitmapDC.CreateCompatibleDC(&pDCShow); CBitmap *pOldBitmap = bitmapDC.SelectObject(&bitmap); //pDCShow.StretchBlt(69, 188, 92, 209, &bitmapDC, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, SRCCOPY); pDCShow.BitBlt(0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, &bitmapDC, 0, 0, SRCCOPY); bitmapDC.SelectObject(pOldBitmap); bitmap.DeleteObject(); // Do not call CDialog::OnPaint() for painting messages } 3.弹出menu CMenu menu; menu.LoadMenu(IDR_MENU1); CMenu* pM = menu.GetSubMenu(0); CPoint pt; GetCursorPos(&pt); pM->TrackPopupMenu(TPM_LEFTALIGN, pt.x, pt.y, this);

上一篇:
VC中添加定时器
下一篇:
网页前端设计备忘杂烩
本文目录
本文目录