2017-03-05 9 views
0

私がコントロールの周りの矩形roundendを描画しようとしている、私はこのような何かやった:ES_PASSWORDスタイルのEditコントロールで四角形を描くことは可能ですか?

enter image description here

が、私は変更する場合:

LRESULT CALLBACK WindPorc(HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lparam) 
{ 
    case WM_CTLCOLOREDIT: 
    { 
     // device handle 
     HDC Chdc = (HDC)wparam; 
     // handle to control 
     HWND CHand = (HWND)lparam; 

     // new object pen... 
     HPEN penx = CreatePen(PS_SOLID, 5, RGB(0, 255, 255)); 


     // apply pen to device handle and back up the original handle 
     HGDIOBJ objb = SelectObject(Chdc, penx); 

     // auto... 
     RECT rectx; 
     GetClientRect(CHand, &rectx); 

     // Now draw the rect with round borders... 
     RoundRect(Chdc, (rectx.left -2), (rectx.top - 2), (rectx.right + 2), (rectx.bottom + 2), 5, 5);  

     // reset device hand... 
     SelectObject(Chdc, objb); 

     // Set text color... 
     SetTextColor(Chdc, RGB(0, 255, 255)); 


     // clean up... 
     DeleteObject(penx); 
     DeleteObject(objb); 


     // I should return a brush for the bk, but this don't care now... 
     //return; 
    } 

} 


void InitUI() 
{ 
    // just the edit control, isn't need the RegisterClass etc... 

     HWND Edit1 = CreateWindowEx 
     (
     NULL, 
     L"EDIT", 
     NULL, 
     WS_CHILD | WS_VISIBLE | 
     ES_LEFT | ES_MULTILINE, // Just a demonstration, it should be ES_PASSWORD 
     10, 120, 200, 22, 
     winx, // parent window HWND... 
     (HMENU)TEXTBOX_1, // id 
     (HINSTANCE)GetWindowLong(winx, GWL_HINSTANCE), 
     NULL 
     ); 
} 

[OK]を、これは次のようになります。

enter image description here

CreateWindowEx(); ES_PASSWORDにエッジ上のスタイルは、このような何かを残して、消え

なぜそれらは消えますか?

答えて

0

私は、実装は複数の方法で間違っていると言うでしょう:あなたが親ウィンドウの(ダイアログの)上に描画したいながら

  • Chdcは、唯一の編集コントロールのクライアント領域に描画することができますDCですクライアント領域。
  • ​​は、矩形がエディットコントロール自体に相対的であるため、常に左上隅に(0,0)を返します。
  • WM_CTLCOLOREDITは、長方形を描くのに最適な場所ではない場合があります。このメッセージが実際に呼び出されたときに確認するためには、いくつかのテストを行う必要があります。

あなたは、実装をこのように残しておきたいときは、必要があります。

  • は、親ウィンドウのDCではなく、エディットコントロールのいずれかを使用して描画します。
  • ​​の代わりにGetWindowRect()を呼び出し、次にScreenToClient()を呼び出して、親ウィンドウのクライアント領域を基準に座標を設定します。
  • WM_PAINTメッセージ(およびBeginPaint()/EndPaint()関数)を使用して、親ウィンドウのDCを取得します。

私はエディットコントロールよりも、いくつかの数ピクセルより大きい、オーナー描画静電気対策を作成し、しかし別の実施を検討するには、「周りの」何とかエディットコントロールを配置(ことを確認するWS_CLIPSIBLINGSスタイルを設定編集コントロールは静的なものの上にとどまります)。描画はWM_DRAWITEMメッセージを処理して実行する必要があります。私はこの実装がより堅牢だと思います。

関連する問題