Wince 開發問題彙總(更新中勿拍,有錯誤請指正謝謝)

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的背景會覆蓋掉剛貼上去的背景圖片,這樣想是在打補丁很是難看,那怎麼辦呢?!我只是想在主對話框上添加一些文字,背景仍然使用主對話框的響應位置的背景。這下問題來了!好吧試了很多種方法,沒想到只需要稍作修改就可以嘍!
 
 
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後面的冒號!!!!否則打不開的!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章