討論區快速選單
知識庫快速選單
網路投保旅行平安險 傑米的攝影旅遊筆記 政府補助!學嵌入式+物聯網
[ 回上頁 ] [ 討論區發言規則 ]
請問如何在MFC的介面上更改輸入方塊(Edit)的背景顏色
更改我的閱讀文章字型大小
作者 : subodh(subodh)
[ 貼文 37 | 人氣 6683 | 評價 0 | 評價/貼文 0 | 送出評價 16 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/9/25 下午 03:09:26
請問如何在MFC的介面上更改輸入方塊(Edit Box)的背景顏色
我想要在介面上,作出輸入方塊(Edit Box)能夠區分『已輸入』、『未輸入』顏色的效果
所以一但有輸入值,就希望能夠將Edit Box背景顏色改成藍色,感謝各位前被先進指導
作者 : subodh(subodh)
[ 貼文 37 | 人氣 6683 | 評價 0 | 評價/貼文 0 | 送出評價 16 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/9/25 下午 03:12:45
且我的介面是多頁籤的對話框(多個CPropertySheet 加入到 CPropertyPage裡),可否做到Edit Box 輸入值後
該頁籤的標題也改變顏色?感謝各位高手的協助!
作者 : subodh(subodh)
[ 貼文 37 | 人氣 6683 | 評價 0 | 評價/貼文 0 | 送出評價 16 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/9/25 下午 04:26:03
ps:以上提問是針對 VC++ 而不是 BCB, BCB直接設定屬性即可,VC++我實在搞不出來,拜託大家不吝指導
作者 : mizar(Mizar) VC++優秀好手貼文超過200則
[ 貼文 249 | 人氣 133 | 評價 1240 | 評價/貼文 4.98 | 送出評價 17 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人subodh註記此篇回應為很有道理 2006/9/25 下午 05:34:51
在視窗class下攔下WM_CTLCOLOR訊息,
當CTLCOLOR_EDIT==nCtlColor就可以指定Edit Control的Brush囉。
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人subodh註記此篇回應為很有道理 2006/9/25 下午 10:32:50
>請問如何在MFC的介面上更改輸入方塊(Edit Box)的背景顏色

む..略..め

codeguru 跟 codeproject 媕雩茼釩雃h這樣的例子.
作者 : subodh(subodh)
[ 貼文 37 | 人氣 6683 | 評價 0 | 評價/貼文 0 | 送出評價 16 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/9/26 下午 03:08:42
我試著攔截OnCtlColor訊息,並更改控制項(Edit Box)的文字、背景色
程式碼如下,可是顏色都無改變,再次請教您們了
還有,請問codeguru 跟 codeproject是要去那裡看,可否提示一下,感激!

HBRUSH CPage1::OnCtlColor(CDC* pDC, CWnd* pWnd, Uint nCtlColor)
{
HBRUSH hbr = CPropertyPage::OnCtlColor(pDC, pWnd, nCtlColor);

HDC hdcEdit = (HDC)GetDlgItem(IDC_TFT_X); //Get handles
     SetTextColor(hdcEdit, RGB(255, 0, 0)); // Text color
     SetBkMode(hdcEdit, OPAQUE); // EditBox Backround Mode
     SetBkColor(hdcEdit,RGB(0, 0, 255)); // Backround color for EditBox

    
return hbr; // Paint it
}
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人subodh註記此篇回應為最佳解答 2006/9/26 下午 08:51:09
>我試著攔截OnCtlColor訊息,並更改控制項(Edit Box)的文字、背景色
>程式碼如下,可是顏色都無改變,再次請教您們了

因為做法錯誤.


>還有,請問codeguru 跟 codeproject是要去那裡看,可否提示一下,感激!

Edit control 的項目都在這裡, 自己去找找看.

  http://www.codeproject.com/editctrl/

  http://www.codeguru.com/cpp/controls/editctrl/

至少有兩種做法.


>HBRUSH CPage1::OnCtlColor(CDC* pDC, CWnd* pWnd, Uint nCtlColor)
>{
> HBRUSH hbr = CPropertyPage::OnCtlColor(pDC, pWnd, nCtlColor);
>
> HDC hdcEdit = (HDC)GetDlgItem(IDC_TFT_X); //Get handles

GetDlgItem() 傳回來的是 edit control 的視窗 handle, 不是 DC. Casting 不能把它轉換成 DC.


> SetTextColor(hdcEdit, RGB(255, 0, 0)); // Text color
> SetBkMode(hdcEdit, OPAQUE); // EditBox Backround Mode
> SetBkColor(hdcEdit,RGB(0, 0, 255)); // Backround color for EditBox


你也不需要去找它的 DC, 直接用傳進來的 pDC 就可以了. 但有一個前提, 你要確定這個 WM_CTLCOLOR 是從你想要更改的 edit control 送來的:

  if ((nCtlColor == CTLCOLOR_EDIT) && (pWnd->GetDlgCtrlID() == IDC_TFT_X))
  {
    pDC->SetTextColor(...);
    pDC->SetBkColor(...);
  }

>
> return hbr; // Paint it
>}

作者 : subodh(subodh)
[ 貼文 37 | 人氣 6683 | 評價 0 | 評價/貼文 0 | 送出評價 16 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/9/27 上午 08:09:00
太感謝sflam(Raymond) 了!!
終於成功了!!學到了不少!!
還有mizar,謝謝!!
作者 : neko2006(neko)
[ 貼文 10 | 人氣 272 | 評價 30 | 評價/貼文 3 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人subodh註記此篇回應為最佳解答 2006/9/27 上午 10:39:36

CDebugDlg : 某個 dialog
IDC_EDIT1 : dialog 裡面的某個 editcontrol 的 ID

攔截 WM_CTLCOLOR message :

class View 裡,在 Messages 下拉選單中找到 WM_CTLCOLOR,然後選擇加入 OnCtlColor。它就會自動幫你增加 message handle 的相關程式碼。

在 OnCtlColor 函式中加入如下:

HBRUSH CDebugDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, Uint nCtlColor)
{
   HBRUSH hbr = CDialogBar::OnCtlColor(pDC, pWnd, nCtlColor);

   // TODO: Change any attributes of the DC here
   // TODO: Return a different brush if the default is not desired

   if (pWnd->GetDlgCtrlID() == IDC_EDIT1) // 檢查是否為我要修改的 control 的 id
   {
     int nLength = GetDlgItem(IDC_EDIT1)->GetWindowTextLengthA();
     // 取得放在 editcontrol 裡的文字長度
     if(nLength>0 )
     {
     pDC->SetTextColor(RGB(255,255,255));
     pDC->SetBkColor(RGB(255,0,0)); // 背景變紅色
     }
     else
     {
     pDC->SetTextColor(RGB(0,0,0));
     pDC->SetBkColor(RGB(255,255,255)); // 背景變黑色
     }
   }
return hbr;
}

作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/9/27 下午 08:29:25
我在上面的回覆有提到至少有兩種做法, 各位大大所展示的, 在 dialog 裡面攔截 WM_CTLCOLOR 的是一種做法.

另一種我認為比較好的做法是繼承 CEdit, 然後在衍生的 class 的 message map 堨[ ON_WM_CTLCOLOR_REFLECT, 讓衍生的 class 自己處理自己的 background color. 這樣你的 特殊的 CEdit class 可以用在任何一個專案, 而不需要在每一個 dialog 都重複處理.

上面的 codeguru 跟 codeproject 堻ㄕ酗@個這樣的例子.

 板主 : 青衫 , Raymond
 > Visual C++ - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - Visual C++ - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
Visual C++
1 青衫 11070 
2 Raymond 10090 
3 Clier 7630 
4 小約翰 2500 
5 Cog 2030 
6 coco 1870 
7 aming 1410 
8 牧童哥 1400 
9 r2109 1380 
10 Akira 1350 
Visual C++
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.1875