• ベストアンサー

ピクチャーコントロールのデバイスコンテキストを取得するためには?

すみません、解決しませんでした・・・ C2005についてです ピクチャーコントロールのデバイスコンテキストを操作するためには どうすればよいでしょうか? void CMainFrame::OnButton() { CMDIChildWnd *mc; mc=MDIGetActive(); CStatic* pStatic=(CStatic*)mc->GetDlgItem(IDC_PICTURE1); CClientDC myPictDC(pStatic); myPictDC.TextOutA(0,0,"aiueo"); } この様にすれば、文字が出力されますが、 モニターの画面上の左上 (0,0)の位置に 出力されてしまいます。 アクティブになった、この子ウィンドウの上にある ピクチャーコントロールに 描画するためには どうすればよいでしょうか? MDIで、複数のウィンドウのうちで アクティブになった ものだけを 操作したいのです。 ピクチャーコントロールの上に描画するためには どうすればよいでしょう? よろしくお願いします。

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

  • ベストアンサー
  • titokani
  • ベストアンサー率19% (341/1726)
回答No.4

void CMainFrame::OnButton() { CXXXView::PicByouga1(); } 違う違う。 そうじゃなくて、メッセージマップのほうでViewにむすびつけます。 void CXXXXView::OnButton1() { : : } VC++6だと、クラスウィザードで、クラス名のところでCXXXViewを選んでやればよいはず。

wxy
質問者

お礼

ありがとうございました。 ビューに記入すれば良かったのですね おっしゃるとおり、操作できました。 ありがとう!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

うまく行かない原因を探索しましょう MFCのアサーションが出るのですか? 現状 動作させた場合何が起きるのでしょう > mc=MDIGetActive(); にブレークポイント設定してステップ実行してみましょう > CStatic* pStatic=(CStatic*)mc->GetDlgItem(IDC_PICTURE1); が失敗した場合 pStaticは NULLになります 失敗する場合は アクティブな子ウィンドに IDC_PICTURE1というIDの子コントロールが存在しない場合です

全文を見る
すると、全ての回答が全文表示されます。
  • titokani
  • ベストアンサー率19% (341/1726)
回答No.2

#1です。 というか、CFormViewですよね。多分。 なら、OnButton()ハンドラをMainFrameじゃなくて、Viewに結びつけるのが一番楽。

wxy
質問者

補足

はい、CFormViewです ダイアログバーの上のボタンをクリックして、 ビュー上のピクチャーコントロールに 描画したいのです。 void CMainFrame::OnButton() { CXXXView::PicByouga1(); } ボタンをクリックして、 void CXXXView::PicByouga1(void) { CDC* pDC=picture1.GetDC(); pDC->TextOutA(20,20,"DDDD"); } この様にビュー上の関数を呼び出すと、 エラー 1 error C2352: 'CXXXView::PicByouga1' : 静的でないメンバ関数の呼び出しが正しくありません と、出ます。 もう少しで、解決するような気がします。 どうすればよいでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • titokani
  • ベストアンサー率19% (341/1726)
回答No.1

pStaticがNULLになっているとか。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ピクチャーコントロールのデバイスコンテキストを取得するためには?

    VC2005についてです ピクチャーコントロールのデバイスコンテキストを操作するためには どうすればよいでしょうか? void CMainFrame::OnButton() { // ここに処理を書く CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd; CButton *pButton =  (CButton*)pFrame->m_wndDialogBar.GetDlgItem(IDC_BUTTON1); pButton->SetWindowText("button"); MDIGetActive()->GetDC()->TextOutA(0,0,"文字列です"); } この様にすれば、アクティブになった 子ウィンドウデバイスコンテキストを取得することができますが、 アクティブになった、この子ウィンドウの上にある ピクチャーコントロールに 描画するためには どうすればよいでしょうか? MDIで、複数のウィンドウのうちで アクティブになった ものだけを 操作したいのです。 MDIGetActive()->GetDlgItem(IDC_PICTURE1)->GetDC()->TextOutA(0,0,"文字列です"); この方法では、エラーがでます。 よろしくお願いします。

  • ピクチャーコントロールのデバイスコンテキストを取得するためには?

    VC2005についてです ピクチャーコントロールのデバイスコンテキストを取得するためには どうすればよいでしょうか? MDIGetActive()->GetDC()->TextOutA(20,50,"文字列です"); この様にすれば、アクティブになった 子ウィンドウデバイスコンテキストを取得することができますが、 アクティブになった、この子ウィンドウの上にある ピクチャーコントロールに 描画するためには どうすればよいでしょうか? MDIで、複数のウィンドウのうちで アクティブになった ものだけを 操作したいのです。 よろしくお願いします。

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

    ビットマップに描画をしてピクチャーコントロールに貼り付けるためには どうすればよいでしょうか? ネットで検索しましたそして、 下のようなコードを書きましたがうまくゆきません。 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で、ボタンをクリックした イベントで描画する場合です、 直線とかは、問題なく描画できました。 ビットマップに描画して貼り付けたいのです、 よろしくお願いします

  • ピクチャーコントロールへの描画方法について

    お世話になります、fujitomoです。 現在、Visual Studio2005にてC++のダイアログベースのアプリケーションを作成しており、行き詰った箇所があったため質問させて頂きました。 アプリケーションの内容としては 現在、アプリケーションで、ダイアログベース上にピクチャーコントロールを2つ設置し、それぞれに波形を描画させています。 ピクチャーコントロールへの波形の描画にはメモリデバイスコンテキストを使い、それぞれ波形描画用のCStatic派生クラスを作成し、そのクラスを SubclassDlgItem でメインダイアダイアログのサブクラスとし、描画間隔として、それぞれの描画クラス内で SetTimer(1,10,NULL) でタイマーイベントを起こし、メモリデバイスコンテキストの描画更新をしています。 ここで質問させていただきたい事なのですが、 2つのピクチャーコントロールのうち、1つのピクチャーコントロールへのみ波形描画を実行させているときはピクチャーコントロールの端から端まで描画が約7秒かかるのに対し、 2つのピクチャーコントロールの描画を同時に実行させた場合には端から端までで約11秒もかかってしまいます。 これを何とか、1つのピクチャーコントロールへの描画時間と同じ時間まで早く出来ればなと思っているのですが、どの様に工夫すれば時間短縮をさせることが出来ますでしょうか? 2つのクラスでそれぞれ10msのタイマーを動かしているのが問題なのかと思い、メインダイアログで10msのタイマーイベントを発生させ、それぞれの描画クラスに描画更新のメッセージを送信させるようにコードを変更してみたのですが、やはり同じ結果となりました。 開発環境は Widows CE 6.0 Visual Studio 2005 です。 ご意見、ご回答をお待ちしております。よろしくお願い致します。

  • タブコントロール上のピクチャーコントロールへの描画

    お世話になっております。 VC2005を使用しております。 SDIベースです。 ダイアログを作成し、その上にタブコントロール(2ページ)を作成しました。 タブコントロールの1ページ目にピクチャーコントロールを配置し、ピクチャーコントロール上に描画を行おうと思うのですが、正常に動作しません。 OnPaintの中で描画を行っているのですがだめのようです。 タブコントロール外に、ピクチャーコントロールを配置すると描画する事ができます。 どのような、タイミングで描画を行えばよいのでしょうか? 教えてください。 よろしくお願いします。

  • ピクチャとHBITMAP

    はじめまして。 VC.net winXPでプログラムの勉強をしてるんですが、 裏画面(メモリDC?)の処理がうまくできません。 ピクチャのプロパティをビットマップにしてOnInitDialogで HBITMAPにLoadimageで読み込み 関連しているCstaticにsetbitmapをしてビットマップの表示をしています。 さらにその上にMoveToやらLineToやらで線を引いているんですが、 ウィンドウが隠れた後等の再描画時に引いた線が消えてしまいます。 それを回避する為に裏画面のHBITMAPに描画し、 それをBitBlt等を使ってピクチャに転送すれば良いような事はわかったのですが、 うまくそれを実現する事ができません。 ソースの一部は以下の通りです。 void CtestpictDlg::OnBnClickedDraw()//コマンドボタンを押した時に処理 { //m_StaticPictureにはOnInitDialogでSetBitmap(m_hBmp)として //ビットマップのセットがしてあり、ダイアログを見るとちゃんと表示されている。 CDC dc; CString str; CWnd *h = GetDlgItem(IDC_STATICPICTURE); CDC *hdc = h->GetDC();//ピクチャのDCを取得 dc.CreateCompatibleDC(hdc); HBITMAP test=CreateCompatibleBitmap(hdc->m_hDC,256,256); //ピクチャからビットマップを初期化 HBITMAP* oldbmp = (HBITMAP*)dc.SelectObject(&test); //dcにビットマップを割り当て CPen p(PS_SOLID,1,RGB(0,255,0)); CPen* oldp = (CPen*)dc.SelectObject(&p); dc.MoveTo(10,10); dc.LineTo(100,100);//とりあえず斜めに線を引けるように。 //m_StaticPicture.SetBitmap(test);//ここでtestを見てみると真っ黒な256*256の画像 BitBlt(hdc->m_hDC,0,0,256,256,dc.m_hDC,0,0,SRCCOPY); //UpdateData(FALSE);必要かどうかわからない… //以下に開放処理等 } まだ勉強し始めて日が浅いので、 ちぐはぐな事をしているかもしれませんがよろしくお願いします。

  • ダイアログボックスについて。

    ダイアログボックスについての質問です。 開発環境はVisual C++ 2005.netでありSDKを利用しています。 ダイアログボックスにPicture Controlを貼り付け、Combo Boxの内容が変わるたびにそのPicture Controlに画像を表示するようなプログラムを作りたいと考えています。 自分が考える手順としてはまずPicture Controlについてサブクラス化を行い、親のダイアログボックスが表示されると同時にPicture ControlのプロシージャでWM_CREATEメッセージを受け取り描画を行う。 そして親のダイアログボックスに貼り付けたCombo Boxの内容が変更された場合に、Picture ControlのウィンドウハンドルにむけてWM_PAINTメッセージを送信する。 こんな手順で行いたいのですが、少し不安な部分が出てきました。 Combo Boxの内容が変更され、Picture Controlのウィンドウハンドルに向けてWM_PAINTメッセージを送信し、Picture ControlプロシージャではWM_PAINTメッセージがきたとき画像の描画を行う場合、このプロシージャではどの画像を描画してよいか不明です。 そのため何番の画像の表示命令が来たのかを示すために、親のダイアログボックスに貼り付けたCombo Boxが変更された場合、Picture Controlに向けてWM_PAINTメッセージと表示画像番号をパラメータとして送信したいのです。 もちろんグローバル変数を用意すれば簡単なのですが、できるだけ使用しないように記述をしたいのです。そこで考えたのが、 SendMessage(GetDlgItem(hDlgWnd, IDC_PICTURE), WM_PAINT, 0, MAKELPARAM(0, number)); このようにnumberをLPARAMの下位ワードとして送信しようと考えました。 このメッセージ送信を行い、Picture ControlプロシージャでWM_PAINTメッセージが到着したとき、LOWORD(lparam)からnumberを取り出す。 実現したい目的のため、このような方法を考えましたが、エラーなく実行できるでしょうか? もしあやしい部分が見つかった場合はアドバイスをお願いします。そしてこの方法よりも簡単に処理できる方法があれば教えていただきたいです。 自分としてはサブクラス化は面倒なので、Picture Controlをオーナードローとして扱う方法も考えましたが、うまく動きませんでしたTT

  • 解像度が変わるとEditコントロールの位置がずれる

    いつも皆様、お世話になっております。 一つ教えてください。 解像度が変わるとエディット・コントロールの位置がずれるのですが、 ずばりクリックした行にエディット・コントロールを張り付かせたいです。 EditCellShow 関数は、セルを↑↓←→で移動した場合 や リストコントロールをスクロールした時などに呼び出されます。 (最後にクリックした行、列は、正しく拾えているものとします。) (そして、workRow、workColumnに代入されます。) 例えば、1280 × 800 ピクセル (Windows Vista 32bit)では、以下のコードで正常に動作します。 1920 × 1080 ピクセル (Windows7 64bit)では、上にずれます。 もし解像度の問題でなければすみません、でも他のXPマシンや Windows7 マシンでも正常に動作しました。 void CFileListCreatorDlg::EditCellShow(int workRow,int workColumn) {   if (m_xvChkEditCellMode == TRUE){     CFileListCreatorDlg::StatusStringSet(_T("ファイル名 や 備考欄 の 編集モードになりました (セルをクリックするか、クリック後 矢印キーで素早く移動、Enterで確定)"),0,FALSE);     //StatusStringSet()関数は、ステータス文字を画面上部に表示し、警告音を鳴らすユーザー関数   }   ::ShowWindow(::GetDlgItem(m_hWnd,IDC_EDIT_Item),SW_HIDE);   ::ShowWindow(::GetDlgItem(m_hWnd,IDC_STATIC_Arrow),SW_HIDE);//追加2011.10.08   ::SetWindowText(::GetDlgItem(m_hWnd,IDC_EDIT_Item),_T(""));   //m_xcListは、IDC_LISTの変数名   m_xcList.SetItemState(workRow, // フォーカス&非選択状態にしたいアイテムのインデックス   !LVIS_FOCUSED | !LVIS_SELECTED, // 状態   LVIS_FOCUSED | LVIS_SELECTED); // マスク   //UpdateWindow(); HWND hWnd1 = ::GetDlgItem (m_hWnd,IDC_LIST); RECT rect;   int nItem;   int nSubItem;   //何回も代入していますが、特に意味はありません、参考サイトのまま ソースコードを使いたかったので、それに合わせました。 nItem = workRow; nSubItem = workColumn;   LastSelectedRow = nItem;   LastSelectedColumn = nSubItem;   ////0:ファイル重複識別ナンバー 1:通し番号 2:フルパス 3:ファイル名 4:おおよそのデータサイズ 5:データサイズ 6:修正日 7:修正時間 8:備考欄 9:書式情報   if((nSubItem == 0 || nSubItem == -1 || nItem == -1) || (nSubItem != 3 && nSubItem != 8)){ //2011.09.22変更     //ファイル名と備考欄のみ編集可能に、他のカラムがクリックされた場合は、ファイル名編集欄に移動     nSubItem = 3;     LastSelectedColumn = nSubItem;   }   CFileListCreatorDlg::m_xcList.EnsureVisible(nItem, FALSE);   CString str = m_xcList.GetItemText(nItem,nSubItem);   ListView_GetSubItemRect(hWnd1,nItem,nSubItem,LVIR_BOUNDS,&rect);   if(nItem != -1)     ::SetWindowPos(::GetDlgItem(m_hWnd,IDC_EDIT_Item),     HWND_TOP,rect.left + (18),rect.top + 4 + ( 16*5+2 ), //追加2011.09.22 //(18)と( 16*5+2 )は、帳尻あわせ //HWND_TOPは、IDC_LISTのTOPを取っているのか? rect.right-rect.left - 3, rect.bottom-rect.top -1,NULL);   ::ShowWindow(::GetDlgItem(m_hWnd,IDC_EDIT_Item),SW_SHOW);   ::SetFocus(::GetDlgItem(m_hWnd,IDC_EDIT_Item));   ::SetWindowText(::GetDlgItem(m_hWnd,IDC_EDIT_Item),str);   ::SetWindowPos(::GetDlgItem(m_hWnd,IDC_STATIC_Arrow),//追加2011.10.08     HWND_TOP,rect.left + (18) -17 ,rect.top + 4 + ( 16*5+2 ), //追加2011.09.22 //(18)と( 16*5+2 )は、帳尻あわせ //HWND_TOPは、IDC_LISTのTOPを取っているのか? 17, 12 ,NULL);   ::ShowWindow(::GetDlgItem(m_hWnd,IDC_STATIC_Arrow),SW_SHOW);//追加2011.10.08 } 参考サイト: http://www.codeproject.com/KB/list/editing_subitems_in_listcontrol.aspx?display=Print (主に、項番10を参考にしました。) 画像を初めて添付しますが、文字が小さいなどの不具合があったら、すみません。 (画像は帳尻あわせをして、正常に動いている時のものです。)

  • 別スレッドからメインダイアログのコントロールにアクセスする方法

    VC++2005 MFC WindowsXPを使用しています。 メインダイアログに作成したエディットボックスに フォーカスをセットしたいのですが、 別スレッドから行うにはどのようにすればよいのでしょうか? メインダイアログにあるボタンを押すと別スレッドの処理に入り、 その中でメインダイアログのコントロールを操作しようとしています。 //フォーカスをセット CWnd* MyEdit = ( CWnd* )this->GetDlgItem( IDC_EDIT1 ); MyEdit->SetFocus(); 宜しくお願い致します。

  • ウィンドウハンドルの取得方法について

    よろしくお願いします。 WIN98 VC++6.0 MFC にて 色々勉強しておりますが、今だにウィンドウハンドルの取得方法が良く分かりません。 SDKのサンプルを見ると、なるほどそうするのか。と思いますが、MFCになると分からなくなります。 たとえば、 ウィザードのデフォルトに従いダイアログベースでのプロジェクトを作成し、ボタン1と2を配置します。 以下のコードでボタン1を非表示にできます。 void CPppDlg::OnButton2() { CWnd* pButton1 = GetDlgItem (IDC_BUTTON1); pButton1->ShowWindow(SW_HIDE); } このコードにおいて、 1.SDKの BOOL ShowWindow( HWND hWnd, // handle to window int nCmdShow // show state of window ); を用いて引数が2個の形式に書きかえることは可能でしょうか? 2.可能であれば、具体的にはどう記述すれば良いのでしょうか?