ダイアログボックスのボタンにビットマップは、貼れるのですが、
256色の時におかしくなってしまいます。
やっぱり、オーナードローで、描画するしかないのでしょうか?
ほかの方法が、あったら教えてください。

A 回答 (1件)

256色の時だけおかしくなるのでしょうか?


であればPallete周りのメッセージを捕まえてちゃんと処理はされてますか?

WM_QUERYNEWPALETTEやWM_PALETTECHANGEDあたりのメッセージを捕まえて別プロセスがパレットを切り替えた時などにちゃんと対処する必要があります。

また、256色モードではシステムが20色分予約してますので実質236色しか使えません(本当は254色まで利用可能ですが・・・)。
なのでビットマップが256色フルに使っているとパレット周りの処理をちゃんとしてもすべて正しい色で表示されるとはかぎりません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Qビットマップに描画をしてピクチャーコントロールに貼り付けるためには?

ビットマップに描画をしてピクチャーコントロールに貼り付けるためには
どうすればよいでしょうか?

ネットで検索しましたそして、
下のようなコードを書きましたがうまくゆきません。


void CXXXView::OnButton()
{


CStatic m_ctlImage; // ピクチャーボックスに関連付けした変数
CBitmap m_bmpImage; // ピクチャーボックスに貼り付けるイメージ
CDC m_dcImage; // Bitmap描画用のDC


CDC* pDC = m_ctlImage.GetDC();
m_dcImage.CreateCompatibleDC(pDC);

CRect Cltsz;
picture1.GetClientRect(&Cltsz);

m_bmpImage.CreateCompatibleBitmap(pDC,Cltsz.Width(),Cltsz.Height());

CBitmap* pOld=m_dcImage.SelectObject(&m_bmpImage);


CPen myPEN(PS_SOLID,5,RGB(0,0,255));
CPen* oldPEN=m_dcImage.SelectObject(&myPEN);
m_dcImage.MoveTo(10,10);
m_dcImage.LineTo(100,100);

m_dcImage.SelectObject(oldPEN);

m_dcImage.SelectObject(pOld);

m_ctlImage.SetBitmap(m_bmpImage);

}

この様にしましたが、ピクチャーコントロールには
何も描画されません、

何故でしょうか?

VS2005で、ボタンをクリックした
イベントで描画する場合です、

直線とかは、問題なく描画できました。

ビットマップに描画して貼り付けたいのです、

よろしくお願いします

ビットマップに描画をしてピクチャーコントロールに貼り付けるためには
どうすればよいでしょうか?

ネットで検索しましたそして、
下のようなコードを書きましたがうまくゆきません。


void CXXXView::OnButton()
{


CStatic m_ctlImage; // ピクチャーボックスに関連付けした変数
CBitmap m_bmpImage; // ピクチャーボックスに貼り付けるイメージ
CDC m_dcImage; // Bitmap描画用のDC


CDC* pDC = m_ctlImage.GetDC();
m_dcImage.CreateCompatibleDC(pDC);

CRect Cltsz;
picture1.G...続きを読む

Aベストアンサー

CStatic型とCBitmap型の変数は クラスのメンバー変数にします

ViewクラスのOnCreateなどでm_ctlImageのインスタンスを作成しておきます

ボタンのOnClickイベントで
CDC* pDC = m_ctlImage.GetDC();
CDC* pMemDC = new CDC;
pMemDC->CreateCompatibleDC( pDC );
m_ctlImage.ReleaseDC( pDC );
if (m_bmpImage.m_hObject != NULL ) {
  // 前回作成オブジェクトを破棄する
  m_bmpImage.DeleteObject();
}
CRect rc;
m_ctlImage.GetClientRect( &rc );
m_bmpImage.CreateCompatibleBitmap( pMemDC, rc.Width(), rc.Height() );
CBitmap* pold = pMemDC->SelectObject( &m_bmpImage );
CPen myPen(PS_SIOLID, 5, RGB( 0, 0, 255 ) );
PCen*pOldPen = pMemDC->SelectObejct( &myPen );
pMemDC->MoveTo(10, 10 );
pMemDC->Lineto( 100, 100 );
pMemDC->SelectObejct( pOld );
pMemDC->SelectObject( pOldPen );
pMemDC->DeleteDC();
delete pMemDC;

m_ctlImage->setImage( m_bmpImage );
といった具合です

ご質問のコードではm_ctlImage.GetDC()でアサートが発生しませんか
ローカル変数のCBitmapでは関数から出た時点で破棄されてしまうので
スタティックコントロールが再描画される時点では 無効なビットマップハンドルになってしまうため描画されないのだと思います

CStatic型とCBitmap型の変数は クラスのメンバー変数にします

ViewクラスのOnCreateなどでm_ctlImageのインスタンスを作成しておきます

ボタンのOnClickイベントで
CDC* pDC = m_ctlImage.GetDC();
CDC* pMemDC = new CDC;
pMemDC->CreateCompatibleDC( pDC );
m_ctlImage.ReleaseDC( pDC );
if (m_bmpImage.m_hObject != NULL ) {
  // 前回作成オブジェクトを破棄する
  m_bmpImage.DeleteObject();
}
CRect rc;
m_ctlImage.GetClientRect( &rc );
m_bmpImage.CreateCompatibleBitmap( pMe...続きを読む

Qビットマップハンドルからビットマップボタンを作りたいです

MFC初心者です。どうかよろしくお願いいたします。
環境はVC++6.0 MFC ダイアログベースです。

HBITMAP hBitmap;

hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(), (LPCTSTR)sSaveFile,IMAGE_BITMAP, 0,0,LR_LOADFROMFILE);

を使ってビットマップハンドルを取得しました。

ここからボタンに貼り付ける方法がわかりません。
リソースにボタンを作った後、どのようにすれば良いでしょうか?

あと、ボタンの好きな位置にビットマップを貼り付ける方法も教えていただけると幸いです。

Aベストアンサー

あら惜しいとこまで……。

クラスウィザードでボタンのメンバ変数を追加しましょう。タイプはCButtonで。

ほいで OnInitDialog あたりで CButton::SetBitmap メソッドなんかを呼び出すのが手っ取り早い方法です。
(ボタンにはBS_BITMAPスタイルを忘れずに)

あと、表示を細かく調整したいならオーナードローになるかと。

QMFC ビットマップ描画で残像が残る

MFCです。

ワーカースレッドで取得したDIBを定期的に描画するプログラムを作っています。
ダブルバッファリングで実現しているのですが、画面リサイズを繰り返すと、再描画の後に、拡大して発生した新しいクライアント領域に古い画像が残ってしまいます。
SelectObject()で選択したコンパチDCのビットマップを選択前のものに戻してなかったのですが、これが原因なんでしょうか?

Aベストアンサー

>SelectObject()で選択したコンパチDCのビットマップを選択前のものに戻してなかった

これが100%確実に原因であるとは断言できませんが、
可能性としてはあり得るでしょう。

「リソース・リーク」になり、ビットマップが正常に描画できなくなるのでは?
と思います。

Q動的に追加したポップアップメニューのオーナードロー

WindowsXp/BCC5.5の環境でアプリ作りを勉強しています。

「mi.fType = MFT_STRING」として、あらかじめ用意したポップアップメニューに動的にメニューを追加できるのですが、その追加したメニューにビットマップを付加するために、「mi.fType = MFT_OWNERDRAW」で追加したいのです。
しかし、これがうまくいきません。
追加じたいは出来るのですが、メニューIDがWM_MEASUREITEMのところに届いていないみたいで
そのため、オーナードローできずにいます。
つまり、「WM_MEASUREITEM」は飛んできますが、メニューID((UINT) wp)はゼロのままです。
本当は「mi.wID = 1200」を取得したいんです。
そのため、ウインドウメッセージ、WM_MEASUREITEM、WM_DRAWITEMは
飛んできますが、オーナードローができず、困っております。

ポップアップメニュー追加のためのコード(以下抜粋)を記載しています。
どなたか、ご教授できないでしょうか。
宜しくお願いします。

<メニュー追加のためのコード>
memset(&mi, 0, sizeof(MENUITEMINFO));
mi.cbSize=sizeof(MENUITEMINFO);
mi.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE;
mi.fType = MFT_OWNERDRAW;
mi.wID = 1200;

InsertMenuItem(hSubMenu,0,TRUE,&mi );

以上

WindowsXp/BCC5.5の環境でアプリ作りを勉強しています。

「mi.fType = MFT_STRING」として、あらかじめ用意したポップアップメニューに動的にメニューを追加できるのですが、その追加したメニューにビットマップを付加するために、「mi.fType = MFT_OWNERDRAW」で追加したいのです。
しかし、これがうまくいきません。
追加じたいは出来るのですが、メニューIDがWM_MEASUREITEMのところに届いていないみたいで
そのため、オーナードローできずにいます。
つまり、「WM_MEASUREITEM」は飛んできますが、メニューID...続きを読む

Aベストアンサー

wParamからIDを取得できるのは ComboBoxやListBoxなどのコントロールのようです
メニューの場合 lParamを適切な構造体のポインタにキャストして itemIDで判定するようですよ

WM_MEASUREITEMならばMEASUREITEMSTRUCT
WM_DRAWITEMならば  DRAWITEMSTRUCT
といった具合です


case WM_MEASUREITEM:
  lpMIS = (LPMEASUREITEMSTRUCT)lParam;
  if ( lpMIS->itemID == 1200 ) {
    // 必要な初期設定
  }
  break;

Qタブをオーナードローすると、ちらついてしまいます

質問させていただきます。

WindowsSDKを用いて、画面を作成しています。
MFCは使用していません。

タブを使っていますが、タブは作成時にTCS_OWNERDRAWFIXEDを指定しています。

WM_DRAWITEMメッセージが来たら、タブを描画していますが
どうしてもちらつきが目立ってしまいます。

WM_DRAWITEMでの処理は、初めにタブの裏画面に描画し
最後にタブに通知された、DRAWITEMSTRUCTのhDCに裏画面の内容をBitBltで転送しています。

メイン画面もダブルバッファリングを行っておりますが、メイン画面はちらついていません。

タブ側で、WM_ERASEBKGNDで何もせずreturnすると、ちらつきはなくなりますが
背景色で塗りつぶされなくなるため、タブが表示される箇所にウィンドウを上に置いたりすると
そこが残ってしまいます。


WM_DRAWITEMが頻繁によばれているため、これはちらついているのでしょうか?
解消方法に頭を悩ませております。
どうぞご教授の程お願いいたします。

Aベストアンサー

>DRAWITEMSTRUCTのrcItemですが、きちんと、渡されたleft,top,right,bottomに収めて描画はしております。

そうすると…チラ付きはやはりWM_ERASEBKGNDが関係していることになる…でしょうね。
WM_DRAWITEMの前に毎回WM_ERASEBKGNDが来る…ということはないかと思われますが、その辺りはどうなんでしょう?
Spy++などで確認できるかと思われますが…。

再描画に1回だけ…であれば、WM_ERASEBKGNDの時にタブ以外の場所を裏画面から描画することで回避できませんかね。
タブ部分はWM_DRAWITEMで描画しますし。


人気Q&Aランキング

おすすめ情報