1、对话框全屏显示
int iFullWidth = GetSystemMetrics(SM_CXSCREEN);
int iFullHeight = GetSystemMetrics(SM_CYSCREEN);
::SetWindowPos(this->m_hWnd, HWND_TOPMOST, 0, 0, iFullWidth, iFullHeight,SWP_NOOWNERZORDER|SWP_SHOWWINDOW|SWP_HIDEWINDOW);
2、按钮贴图
按钮属性 Owner Draw 设为true
//*.h
CBitmapButton m_btn;
//*.cpp
m_btn.AutoLoad(IDC_BUTTON1,this);
m_btn.LoadBitmaps(IDB_BITMAP1);
http://blog.csdn.net/zhangyulin54321/article/details/8154582
3、如何贴图作为背景图,不覆盖掉文字
以上方法可以实现按钮控件得贴图,但是要自己绘制按钮,这样是实现贴图了,但是按钮上的文字就没有了。今天找到了一种,贴图只作为背景图的方法,不会覆盖掉按钮控件上的文字。其实在才是我最初想要的效果。
重写WM_CTLCOLOR消息的响应函数 OnCtlcolor();
HBRUSH CxxxxxxxxDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
RECT rect;
CDC memDC;//定义一个设备上下文
CBitmap bmp;//定义位图对象
switch(nCtlColor)
{
case CTLCOLOR_BTN:
GetDlgItem(pWnd->GetDlgCtrlID())->GetWindowRect(&rect);
memDC.CreateCompatibleDC(pDC);//创建兼容的设备上下文
bmp.LoadBitmap(IDB_BITMAP1);//加载位图
memDC.SelectObject(&bmp);//选中位图对象
memDC.SetBkColor(RGB(255,255,255));
pDC->BitBlt(0,0,rect.right,rect.bottom,&memDC,1,1,SRCCOPY);//绘制位图
pDC->SetBkColor(RGB(255,255,255));
return (HBRUSH)GetStockObject(HOLLOW_BRUSH);
break;
default:
break;
}
}
此方法不但能够为按钮控件重绘背景,其他很多控件都可通过此方法实现背景的重绘,效果还不错。
百科里面这样介绍nCtlColor的:
OnCtlColor是控件
窗口函数,其画刷句柄效果提示
信息函数( afx_msg HBRUSH OnCtlColor )构成:返回值,OnCtlColor必须返回一个刷子句柄,该刷子将被用于画出控件的背景。参数,pDC 包含了子窗口的显示设备环境的
指针。可能是临时的。PWnd 包含了要求颜色的控件的
指针。可能是临时的。 NCtlColor 包含了下列值,指定了控件的类型: CTLCOLOR_BTN 按钮控件 · CTLCOLOR_DLG 对话框 · CTLCOLOR_EDIT 编辑控件 · CTLCOLOR_LISTBOX 列表框控件 · CTLCOLOR_MSGBOX
消息框 · CTLCOLOR_SCROLLBAR 滚动条控件 · CTLCOLOR_STATIC
静态控件
4、ListControl 背景色问题
SetBkColor 设置整个列表的背景色
SetTextBkColor 设置列表中文字的背景色;
5、问题:希望当按下键盘上的上下左右按键可是实现列表框中行选中的同时执行其他的操作和控件之间的切换?
思路:只要但按键按下后能判断出是哪个按键按下了就可以解决问题了
尝试一:添加WM_KEYDOWN的响应函数OnKeyDown 尝试通过此消息获取按键按下的信息。
void CProgramDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
switch(nChar)
{
case VK_UP://38
MessageBox(L"上");
break;
case VK_DOWN:
MessageBox(L"下");
break;
case VK_LEFT:
MessageBox(L"左");
break;
case VK_RIGHT:
MessageBox(L"右");
break;
}
CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}
结果测试发现,该函数并没有响应,难道是按钮触发不了消息吗?消息没有发出吗?还是没有接收到呢?好吧,应该是按键按下后发出的消息被系统处理了,这就是为什么我们看到列表控件中选中行在变,我们自己定义但却没有响应的原因了吧!
尝试二:拦截消息,
BOOL CProgramDlg::PreTranslateMessage(MSG* pMsg)
{
CString s;
if (pMsg->message == WM_KEYDOWN)
{
switch(pMsg->wParam)
{
case VK_UP://38
MessageBox(L"上");
break;
case VK_DOWN:
MessageBox(L"下");
break;
case VK_LEFT:
MessageBox(L"左");
break;
case VK_RIGHT:
MessageBox(L"右");
break;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
在系统响应这个消息之前我们先拿过来判断下,结果发现消息里面藏着按键的信息,找出来解析下搞定。
6、还是贴图。
现在有一张背景图片想贴到主对话框上,并在上面进行界面设置,防止各种控件,但放置Static控件时 Static的背景会覆盖掉刚贴上去的背景图片,这样想是在打补丁很是难看,那怎么办呢?!我只是想在主对话框上添加一些文字,背景仍然使用主对话框的响应位置的背景。这下问题来了!好吧试了很多种方法,没想到只需要稍作修改就可以喽!
现在有一张背景图片想贴到主对话框上,并在上面进行界面设置,防止各种控件,但放置Static控件时 Static的背景会覆盖掉刚贴上去的背景图片,这样想是在打补丁很是难看,那怎么办呢?!我只是想在主对话框上添加一些文字,背景仍然使用主对话框的响应位置的背景。这下问题来了!好吧试了很多种方法,没想到只需要稍作修改就可以喽!
HBRUSH CXXXXDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
RECT rect;
CDC memDC;//定义一个设备上下文
CBitmap bmp;//定义位图对象
if(nCtlColor == CTLCOLOR_STATIC)
{
GetDlgItem(pWnd->GetDlgCtrlID())->GetWindowRect(&rect);
memDC.CreateCompatibleDC(pDC);//创建兼容的设备上下文
bmp.LoadBitmap(IDB_BITMAP3);//加载位图
memDC.SelectObject(&bmp);//选中位图对象
pDC->BitBlt(-rect.left,-rect.top,rect.right,rect.bottom,&memDC,1,1,SRCCOPY);//绘制位图
pDC->SetBkMode(TRANSPARENT);
return (HBRUSH)GetStockObject(HOLLOW_BRUSH);
}
return hbr;
}
void CXXXXDlg::OnPaint()
{
RECT rect;
CDC memDC;//定义一个设备上下文
CBitmap bmp;//定义位图对象
CPaintDC dc(this); // device context for painting
this->GetWindowRect(&rect);
memDC.CreateCompatibleDC(&dc);//创建兼容的设备上下文
bmp.LoadBitmap(IDB_BITMAP3);//加载位图
memDC.SelectObject(&bmp);//选中位图对象
memDC.SetBkColor(RGB(255,255,255));
dc.BitBlt(0,0,rect.right,rect.bottom,&memDC,1,1,SRCCOPY);//绘制位图
}
static 控件的透镜效果 就这样完成了!
7、mfc开发wince串口通信问题
需要注意的是 用CreateFile打开串口的时候 串口名字为“COM1:”,要特别注意COM1后面的冒号!!!!否则打不开的!