ウィンドウのフレームの色変更

このQ&Aのポイント
  • ウィンドウのフレームの色を変更したい場合、GetClientRect関数を使用してクライアント領域の色を変更することができます。
  • しかし、クライアント領域の外側にあるフレームの色を変更するためには、別の方法が必要です。
  • 詳細な方法については、助けを必要とする方に向けて具体的な方法を教えることができます。
回答を見る
  • ベストアンサー

ウィンドウのフレームの色変更

<環境> Win98 VC++6.0 MFC よろしくお願いします。 ダイアログのボタン押し下げにて、新規にウィンドウを作成しています。 新規に作成したウィンドウのクライアント領域の色は、 CPaintDC dc(this); // 描画用のデバイス コンテキスト CRect cr; GetClientRect( &cr); dc.FillSolidRect( cr, RGB( 250, 250, 0)); dc.DrawText( moji,cr, DT_SINGLELINE | DT_VCENTER | DT_CENTER); にて変更することが出来ました。 クライアント領域の外側にあるフレームの色も変更したいのですが、 どのようにすれば実現可能でしょうか? ご存知の方、教えてください。お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

非クライアント領域の描画の際には、WM_NCPAINTが送られてきます。 ということで、OnNcPaintになります。 あとは、好きに描画してください。ただし、非クライアント領域すべてを描画する必要がありますので、キャプション、メニュー等がある場合は、フレームだけ描画ではだめです。

VitaminBB
質問者

お礼

回答ありがとうございます。 以下のようにして目的を達成できました。 フレームの幅(全体ではなく枠の細い幅)が分からなかったので4としました。 void CMyWnd::OnNcPaint() { int cyCaption = 4;//GetSystemMetrics(SM_CYCAPTION);//タイトルバーの高さを取得 int cxFrame = GetSystemMetrics(SM_CXFRAME); // フレームの幅 int cyFrame = GetSystemMetrics(SM_CYFRAME); // フレームの高さ COLORREF crCaption = RGB(250, 250, 0); // 塗りつぶす色 CRect rcWnd; GetWindowRect(rcWnd); CDC* pDC = GetWindowDC(); pDC->FillSolidRect(0, 0, rcWnd.Width(), cyCaption, crCaption);//フレーム上部 pDC->FillSolidRect(0, cyFrame, 4, rcWnd.Height(), crCaption);//左 pDC->FillSolidRect(rcWnd.Width()-cxFrame, cyFrame-cxFrame, 4, rcWnd.Height(), crCaption);//右 pDC->FillSolidRect(0, rcWnd.Height()-4, rcWnd.Width(), 4, crCaption);//フレーム下部 ReleaseDC(pDC); }

その他の回答 (2)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

>新規に作成したウィンドウのクライアント領域の色は、 書かれていたクライアント領域の方のソースを見て気になったんですが。 http://www.okweb.ne.jp/kotaeru.php3?q=609410 あえてこうしなかったんですか?わざわざ自分で塗ってますけど。

VitaminBB
質問者

お礼

回答ありがとうございます。 深い意味はありません。 成り行きで作ったため、ツギハギだらけになってしまいました。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

一応、調べればわかると思いますが。 非クライアント領域を含むウィンドウのデバイスコンテキストハンドル取得 CWnd::GenWndowDC() フレームの幅等の取得 ::GetSystemMetrics() WM_NCPAINTのwParamで渡されるリージョンがほしい場合は OnNcPaintを使うのではなく、CWnd::WindowProcをオーバーライドして、SDKのように自分でメッセージを処理してください。

VitaminBB
質問者

お礼

回答ありがとうございます。

関連するQ&A

  • 文字列の表示

    環境 WIN98 VC++6.0 MFC にて よろしくお願いします。 while((fgets(buf,256,fin))!=NULL) { n=strlen(buf); buf[n-1]='\0'; 略 } 上記のようにしてファイルから1行ずつ読み込み表示させる場合、 AfxMessageBox(buf);では正しく表示されますが、 クライアント領域にdc.DrawText( buf,cr, DT_SINGLELINE | DT_VCENTER | DT_CENTER);で表示させると文字列の最後に文字化けした1文字が追加されてしまいます。 このような場合どのように対処すれば良いのでしょうか?

  • クライアント領域をCBitmapに取り込みたい

    VC6.0MFCで クライアント領域(みたまま)を CBitmapに取り込みたいのですがどうすればよいのでしょうか? ためしにダイアログの領域をクリップボードに取り込むコード OnPaint書いたのですが真っ黒の画像しか取り込めていませんでした。 根本的に使うAPIが違うのでしょうか? void CCaptureDlg::OnPaint() {  CPaintDC dc(this); // 描画用のデバイス コンテキスト  CRect cr;  GetClientRect(&cr);  dc.TextOut(0,0,"テスト");  CDC* pDC = new CDC();  pDC->CreateCompatibleDC(&dc);  CBitmap img;  img.CreateCompatibleBitmap(pDC, cr.Width(), cr.Height());  OpenClipboard();  ::EmptyClipboard();  ::SetClipboardData(CF_BITMAP, img.GetSafeHandle());  ::CloseClipboard();  pDC->DeleteDC();  delete pDC;  CDialog::OnPaint(); }

  • 非クライアント領域への描画について

    非クライアント領域に文字を書こうとしました。 以下の(2)では書けますが、(1)では書いてくれません。 CPaintDCはクライアント領域でないとダメなのですか? void CMainFrame::OnPaint() { CPaintDC dc(this); // 描画用のデバイス コンテキスト dc.TextOut(0,0,"こんにちは"); ・・・(1) CDC* pDC = GetWindowDC(); pDC->TextOut(100,0,"こんにちは"); ・・・(2) 環境 WIN98 VC++6.0 MFC

  • 変数の代入について

    ダイアログベースで、ダイアログ1からダイアログ2を開きダイアログ1のエディットボックスのデータをダイアログ2に表示する下記コードを教わりました。 変更後のようにしても問題ないと思いましたが、'dlg' は定義されていない識別子です。とエラーが出ます。 どうしてなのかお教えていただきたいのですが、 よろしくお願いします。 <変更前> CSubDlg dlg2; dlg2.m_strText = strText; dlg2.DoModal(); <変更後> void CSubDlg::OnPaint() { m_strText = dlg.strText; ちなみにdlgはウィザードが作ったコードで、 CMainDlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); ダイアログ1のことだと思うのですが。。。。 ************************** メインダイアログとしてCMainDlgを例にしますが、かなり割愛します。 このダイアログには、Editが貼り付けられているとします。Editコントロールに割り当てたIDをIDC_EDIT_INPUTだと仮定します。 DDXとかのデータ変換を使う方法もありますが、ここでは単にデータを取得します。 // // OKボタンが押された時の処理 // void CMainDlg::OnOK() { // データの取得 CString strText; GetDlgItemText(IDC_EDIT_INPUT, strText); CSubDlg dlg2; dlg2.m_strText = strText; dlg2.DoModal(); } class CSubDlg : pbulic CDialog { public: CString m_strText; // 親から渡される文字列を格納する変数 ・ ・ ・ ・ ・ }; あとは、CSubDlgのOnPaintでテキストを描画します。 void CSubDlg::OnPaint() { // テキストをクライアント領域の中央に描画 CRect rect; GetClientRect(rect); CPaintDC dc(this); dc.TextOut(m_strText, rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); }

  • VCでの問題・・・

    マッピングモードでつまづいてます。 SetMapMode(MM_LOENGLISH); CRect rect; GetClientRect(&rect); pDC->Ellipse(0,0,rect.right,-rect.bottom); とした場合、クライアント領域全体に楕円が表示されると思っていたのですが、右と下に余白があいてしまいます。 MM_TEXTだと思ったように表示されるのですが、MM_LOENGLISHだとGetClientRectでしっかりと領域を取得できていないようです。どうすればMM_LOENGLISHでしっかりとクライアント領域を取得できますか? まだ、VCはじめたばかりで分からないことだらけです。 どうかよろしくお願いします。

  • リッチエディットの独自描画で文字の位置をそろえたい

    リッチエディットのWM_PAINT命令をフックすることで、改行文字を視覚化するプログラムを組んでいるのですが、GetCharPos命令で取得した文字位置の座標は左上隅のものなので、一般のテキスト文字と描画した文字がうまく横並びになりません。また、GetTextExtentでフォントの高さを取得することで、水平位置を調整しようと思ったのですが、フォントの高さとリッチエディットの一行単位の高さが異なるためか、以下のコード例(MFCにて作成)でもやはりきれいに揃いません(文字数制限のため、一部コードを省いています)。 void CRichEditEx::OnDrawFormatChar() { CString strText; GetWindowText(strText); CPoint ptCharL; CClientDC dc(this); //m_foFormatCharは //SetDefaultCharFormat()で登録したフォントと //サイズ・フォント名ともに同一 CFont* pfoOld = dc.SelectObject(&m_foFormatChar); CSize sizChar = dc.GetTextExtent(_T("W")); CRect rectClient; GetRect(&rectClient); int i, iPos = 0; while(iPos != -1){ iPos = strText.Find(_T('\n'), iPos); if(iPos != -1){ ptCharL = GetCharPos(iPos); if(ptCharL.y > rectClient.bottom) break; if(rectClient.PtInRect(ptCharL)){ dc.DrawText(_T("N"), CRect(ptCharL, ptCharL + sizChar), DT_SINGLELINE | DT_VCENTER); } } } フォントの上下余白を含めた高さ、あるいは、リッチテキストの1行単位の高さが取得できれば何とかなると思うのですが、よい方法はございますでしょうか。

  • MFC FormViewの背景色

    MFCで開発してます。 CFormViewのクライアント領域を4分割して、右上だけ背景色を他の領域とは違う色にしたいのですが、 InvalidateRect(NULL, TRUE)の後のOnEraseBkgnd()とOnDraw()で、FillSolidRect()で右上だけ塗りつぶしても色が変わりません。 何が原因と考えられるでしょうか? よろしくお願いします。

  • 別ソースファイルからの呼び出し

    現在VC++6.0でプログラムをしています。 そこで基本的な質問かもしれないのですが 別のソースファイルからの呼び出しはどのようにおこなえばいいのでしょうか?具体的には 前略 void CDioBitDlg::OnButtonAioInputDiBit() { //デジタル入力 UpdateData(TRUE); short DiData; Ret = AioInputDiBit(Id, m_DioBit, &DiData); if(Ret != 0){ Ret2 = AioGetErrorString(Ret, ErrorString); TextString.Format("AioInputDiBit = %d : %s", Ret, ErrorString); m_ErrorString.SetWindowText(TextString); return; } TextString.Format("入力データ : %d", DiData); m_DioData.SetWindowText(TextString); m_ErrorString.SetWindowText("デジタル入力 : 正常終了"); } 後略 別のソース 前略 void CSimulatorWnd::OnPaint() { CPaintDC dc(this); //描写用のデバイスコンテキスト CRect cr; GetClientRect(&cr); dc.FillSolidRect(cr, RGB(0,0,0)); } 後略 前述のは入力信号をデジタルの1もしくは0で表示するダイアログプログラムなのですが この1もしくは0の値を後述のソースファイルに持ってくる場合どのようにすればよいのでしょうか?

  • MFC C++

    MFCでソリューションを新規作成した時に作られるプログラムにちょこちょこと手を加えています。 以下のプログラムは、画面の中心に黒い円を描くプログラムの一部です。 void CChildView::OnPaint() { CPaintDC dc(this); // 描画のデバイス コンテキスト CRect rect; GetClientRect(&rect); CPoint center = rect.CenterPoint(); const int sizeCircle = 60; CSize offset(sizeCircle / 2, sizeCircle / 2); CSize size(sizeCircle, sizeCircle); CRect rectCircle(center - offset, size); CBrush brush(RGB(0, 0, 0)); CBrush* pBrushOrg = dc.SelectObject(&brush); dc.Ellipse(rectCircle); dc.SelectObject(pBrushOrg); } どなたか以下のことを教もらえないでしょうか。 (1)CSize size(sizeCircle, sizeCircle);の部分ですが、size()はCSizeのメンバ変数ではないと思うのですが、size()の型がCSizeになっているのはどうしてでしょうか? (2)上の続きで、size()関数は見る限りどこにも定義されていなかったのですが、どこかに元々定義があるのでしょうか?(元々というのは、Microsoft側で定義してくれているということです。) (3)dc.Ellipse(rectCircle);の部分で、dc.とはどういう意味でしょうか? どなたかお願いします。

  • D3DXCreateFontとID3DXFont::DrawTextによる文字列の縦書き描画

    お世話になっています。 D3DXCreateFontとID3DXFont::DrawTextによって文字列を左上(0,0)右下(20,100)の四角形内に縦書き描画しようと、以下のようにコードを書きました。 CreateFontの第3引数cEscapementを2700にし、 CreateFontの第4引数cOrientationも2700にしてCreateFont、D3DXCreateFontによって作成したフォントで、 SetRect(0,0,20,100); DrawText(Str,-1,&rc,DT_SINGLELINE | DT_WORD_ELLIPSIS | DT_NOCLIP, D3DCOLOR_XRGB(0,0,0)); 上のようにして実行すると、何も表示されません。 SetRectの引数を変えてみたりはしたのですが、それでもやはり上手くいきませんでした。 もちろん、フォントは縦書きフォントを指定しています。 さっぱり原因がわからないので、どなたがご存知の方がいらっしゃれば、ご教授よろしくお願いします。 開発環境:Visual Studio 2005 C++ 開発言語:C/C++(Win32API)+DirectX9.0b

専門家に質問してみよう