4

ダイアログボックスを一致させようとしています。私はグーグルやランダムテストなどをすべて行ってきましたが、それができない場所を読んでもいます。

私ができることは、メッセージの1つを使用してフォントと色を設定することですが、描画自体についてはどこにもありません。

私はそれができる必要があると思います...

誰にもアイデアはありますか?または、これについて何か知っていますか?

http://imageshack.com/a/img832/5955/91m.png

4

3 に答える 3

2

編集コントロールは所有者の描画をサポートしていないようですが、それでも直接の問題を解決できます。EDITTEXT の MSDN ページによると、既定では、リソース ファイル内の編集コントロールにはWS_BORDERスタイル セットがあります。次のようなものでそれを取り除くことができるようです:

EDITTEXT IDC_EDIT1,17,51,136,14,ES_AUTOHSCROLL | NOT WS_BORDER

ステータス バーについては、実際のステータス バーではなく、色をカスタマイズした静的コントロールを使用してみてください。または、独自に作成し、リソース ファイルでウィンドウ クラス名を指定し、ダイアログを表示する前にクラスを登録することもできます。

更新: うわー、ステータス バーのドキュメントはひどいです。ただし、所有者は 1 枚引くことができます。次の手順を実行します:

// where hStatus is the HWND of a status bar...

// You must set simple mode to false, because simple mode doesn't
// support owner draw.

SendMessage(hStatus, SB_SIMPLE, FALSE, 0);

// I'm assuming 1 status bar part for demonstration. Setting the right edge
// for the 1 part to -1 make it take up the whole status bar.

int partWidths[] = { -1 };

SendMessage(hStatus, SB_PARTS, 1, reinterpret_cast<LPARAM>(partWidths));

// There is background stuff that stays behind even with owner draw,
// so you have to set the background color to black, too, to get rid of
// any appearance of borders.

SendMessage(hStatus, SB_SETBKCOLOR, 0, RGB(0, 0, 0));

// There is still a slim border that stays behind, so you need to set
// SBT_NOBORDERS in addition to SBT_OWNERDRAW. The 0 is the index of the
// status bar part. It could be anything between 0 and 255.

SendMessage(
    hStatus,
    SB_SETTEXT,
    SBT_NOBORDERS | SBT_OWNERDRAW | 0,
    reinterpret_cast<LPARAM>(_T("Status")));

そこからWM_DRAWITEM、ステータス バーの も処理する必要があります。さて、ステータスバーのドキュメントがひどいと私が言う理由について...

ドキュメントSB_SETTEXTの下位ワードの上位バイトは、WPARAM次の値のいずれかになります。これには 2 つの問題があります。

  1. それらを組み合わせることができます。これを機能させるには、あなたがしなければなりません。MFCもそれを行います。私がチェックしました。

  2. と書きたくなるかもしれませんMAKEWPARAM(MAKEWORD(0, SBT_OWNERDRAW), 0)。これは機能しません。外観によって、SBT_スタイルは定義されているため、インデックス値と OR を使用すると、下位ワードの上位バイトに自動的に表示されます。

SB_SETTEXT正しく使用する方法を理解するために、MFC のソース コードを調べなければならなかったことは明らかです。

于 2013-07-31T05:45:43.530 に答える
1

エディット コントロールにはオーナー描画モードがありませんが、エディット コントロールをサブクラス化しWM_ERASEBKGNDWM_NCPAINTWM_PAINT、 などのメッセージやWM_CTLCOLOREDIT、エディットの親ウィンドウに送信されるメッセージを処理できます。

于 2013-07-31T06:45:31.553 に答える
0

パート 2、編集でテキストを垂直方向に配置するための答え:

        RECT rect;
        GetClientRect(GetDlgItem(hwnd, IDC_TIMEINPUT),&rect);          
        Rectangle(hdcEdit, rect.left, rect.top, rect.right, rect.bottom);            
        rect.left+=5; rect.top+=5; rect.right+=5; //rect.bottom+=5;
        SendMessage(GetDlgItem(hwnd, IDC_TIMEINPUT), EM_SETRECTNP, 0, (LPARAM)&rect);

複数行にする必要があり、実際にはさまざまな数字をいじって、単一行に保ち、垂直方向の位置合わせを維持する必要があります。EMS_SETRECTNP を使用すると、テキストを配置する場所を指定できるため、Edit の高さを大きくすることができます。

于 2013-08-01T22:19:00.347 に答える