• 締切済み

エディットコントロールを再描画させるには。

CreateWindowEx()でエディットボックスを作り、配置して、 その背景のクライアント領域にビットマップを表示しようとしています。 ところが、再描画しようとした時に、BeginPaintで取得したHDCにBitBltでビットマップを表示するのは、問題なく動くのですが、 GetDCで取得したものに、BitBltを行うとエディットボックスが下に隠れてしまいます。(ビットマップで塗りつぶされてしまっています) それで、GetDCでも大丈夫なようにしたいのですが、 何か方法は無いでしょうか? どなたかお願いいたします。

みんなの回答

  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.2

エディットボックスに対し、UpdateWindowを実行したらどうでしょうか?

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

リージョンで領域を制限し、エディットボックスの矩形の部分を除外する。

関連するQ&A

  • OnPaint() とOnDraw()の違いについて

    OnPaint内に記述した下記コードでビットマップが描画されますが、OnDraw内だと描画されません。 どうしてなのか教えてください。 お願いします。 void CAbcView::OnPaint() { HBITMAP myDIB; // ビットマップのハンドル HBITMAP oldDIB; HDC hDC; // デバイスコンテキストのハンドル HDC hCompatiDC; // メモリデバイスコンテキスト PAINTSTRUCT ps; // クライアント領域の描画に使う情報を保持 if(!m_BmpInfo) return; hDC = ::GetDC(m_hWnd);//これでもOK ::BeginPaint(m_hWnd,&ps); hCompatiDC = ::CreateCompatibleDC(hDC);//hDC); myDIB = ::CreateDIBitmap(hDC,&m_BmpInfo->bmiHeader, CBM_INIT,m_BmpImage,m_BmpInfo,DIB_RGB_COLORS); oldDIB=(HBITMAP)::SelectObject(hCompatiDC,myDIB); BitBlt(hDC,5,25,m_BmpInfo->bmiHeader.biWidth, m_BmpInfo->bmiHeader.biHeight,hCompatiDC,0,0,SRCCOPY); 略 } 環境 WIN98 VC++6.0 MFC にて

  • ウインドウズアプリケーションでの図形描画

    プログラミング初心者の学生です。 ウインドウズアプリケーションで図形を描画するプログラムを作成しようとしています。 エディットボックスに入力した値を使って,四角形などの図形を描画することができるようにしたいのですが,うまくいきません。 エディットボックスに入力した値を取得して,例えば ectangle( hDC, 100, 100, 200, 200 ); の数字の場所に代入するようなことは可能でしょうか。 初歩的な質問で申し訳ありませんが,教えていただけると嬉しいです。

  • エディットボックス

    VC++、APIでwindowsプログラムを書いています。ダイアログボックスで質問があります。 case WM_INITDIALOG: SetDlgItemText(hDlg, IDC_EDIT1, "0"); return TRUE; で読み取り専用エディットボックス内に初期値を書き case WM_CTLCOLORSTATIC: { HDC hdc = (HDC)wParam ; SetTextColor( hdc, RGB( 255, 255, 255)) ;// 白色 SetBkMode(hdc, TRANSPARENT); // 背景を透過 return (BOOL)(HBRUSH)GetStockObject(NULL_BRUSH) ; } でダイアログボックス内のスタティックテキストと読み取り専用エディットボックスの背景を同時に透過させているのですが、エディットボックス内の文字を void ddd( HWND hDlg, int xxx) { char ttt[100]; sprintf(ttt,"%d",xxx); SetDlgItemText(hDlg, IDC_EDIT1, ttt); return ; } で書き換えると古いテキストが残ったように表示されます(背景に色を指定すれば古いテキストは残らない)。 うまく表示させるにはどういった方法があるでしょうか? ご存知の方、よろしくお願いします。 ちなみにダイアログボックスにはビットマップが貼ってあります。

  • ピクチャと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);必要かどうかわからない… //以下に開放処理等 } まだ勉強し始めて日が浅いので、 ちぐはぐな事をしているかもしれませんがよろしくお願いします。

  • Windowsプログラミング 画面描画 ちらつき

    SetDIBitsToDevice関数を使って画面に描画をした後、LineTo関数やEllipse関数を使って その画面上に線や丸を表示させる処理をしているのですが、描画処理を一度にできていないためか ちらつきが発生してしまいます。 調べてみるとビットマップのマルチバッファリングなどが解決策にあるのですが、 私は一次元配列で画素値を格納していてビットマップに情報は保持していないため よく解決策で使われているBITBLTが使えない状態です。 裏画面に描画しておいて、最終的に描画は一度だけにするという考えは分かるんですが、 これをSetDIBitsToDevice関数を用いてちらつきが発生しないようにできるんでしょうか? プログラムとしては画像の上に線と円をひたすら描画していくようなイメージをしています。 アドバイスお願いします! case WM_PAINT: hDC=BeginPaint(hParent,&ps); SetDIBitsToDevice( ps.hdc, 0, 0,// コピー先x,y座標 pimg -> bih.biWidth,// DIBの幅 pimg -> bih.biHeight,// DIBの高さ 0, 0,// DIBの座標 0,// 走査線 pimg -> bih.biHeight,/ 走査線数 pimg -> lpBmpData, (BITMAPINFO *)&( pimg -> bih),// BITMAPINFOにキャスト DIB_RGB_COLORS ); for(int i=0; i<number-1; i++){ if(i==0){  hPen1 = CreatePen(PS_SOLID, 1, RGB(255,0,0));  electObject(hDC,hPen1);  MoveToEx(hDC,Xs,Ys,NULL);  Ellipse(hDC,Xs-2,Ys-2,Xs+2,Ys+2); }else{  LineTo(hDC,Xe,Ye);  Ellipse(hDC,Xs-2,Ys-2,Xs+2,Ys+2); } }

  • VisualC++6.0にてボタンにビットマップを表示させる方法

    VisualC++6.0のダイアログベースのアプリにおいて、 フォーム上に配置したボタン上にビットマップを表示 させたいと思ってます。OnPaint()の中で、以下のコード を書いたのですが、うまくいきません。  CWnd* myWnd = GetDlgItem(IDC_BUTTON1);  CDC* pDC = myWnd->GetDC();  CDC myDC;  CBitmap myBMP;  myBMP.LoadBitmap(IDB_BITMAP);  myDC.CreateCompatibleDC(pDC);  CBitmap* oldBMP = myDC.SelectObject(&myBMP);  pDC->BitBlt(0,0,100,100,&myDC,0,0,SRCCOPY);  myDC.SelectObject(oldBMP); ビットマップはちゃんと書かれてはいますが、その上にボタンが 描かれてしまうので、ビットマップが隠されてしまいます。 解決方法を教えてくださいますでしょうか。 よろしくお願いします。 % 絵をクリックするとアクションを起こすようにしたいので、 % ピクチャーボックスでも試してみました。これだとビット % マップはちゃんと表示されますが、BN_CLICKEDを書いて % ピクチャーボックスをクリックしてもOnPict()に処理が % 移りません。

  • マウスカーソルのデスクトップ描画について

    vb2008で現在のマウスカーソルのハンドルを取得し、デスクトップに描画するというプログラムを組んでいます。しかし、以下の部分を実行してもマウスカーソルは描画されません。どこがおかしいのでしょうか? Dim hcur As Long Dim hdc As Long 'マウスカーソルのハンドル取得 hcur = GetCursor() 'デスクトップのデバイスコンテキスト取得 hdc = GetDC(GetDesktopWindow()) 'カーソル描画 DrawIcon(hdc,0,0,hcur) ちなみに同名のAPIの宣言はしてあります。 後,このソースの用途ですが,複数マウスに対応した複数カーソルの表示です。もしそれにあたって別の方法でカーソルを表示すべきなどのご指摘がありましたら,それもよろしくお願いします。

  • VC++6.0 エディットボックス、スピンコントロールについての質問

    VC++中の下ぐらいの技術者です。 エディットボックスにfloat型のメンバ変数を関連付けて使っています。 しかし、実際に値を打ち込むときに小数点、つまり「.」キーを押すと、 エディットボックス内でカーソルが先頭に戻ってしまいます。 これは直せませんか? また、スピンをエディットボックスのタブオーダーの次に配置し、プロパティのスタイルで 「自動関連付け」と「数値の自動表示」にチェックを入れたら、 そのコントロールが配置されたダイアログを表示するとエラーで表示できません。 これらの原因、解決方法の分かる方ご教授お願いします。

  • c言語を使いダイアログにbmpを表示したい 

    はじめまして、 私は、c言語は初心者なのでが、ダイアログボックスに、画像(bmp)が表示することができません。 ソースは、 hdc = BeginPaint(hDlg, &ps); //指定ウィンドウ内での描写準備 // ビットマップをファイルからロードする hBitmap = ::LoadBitmap( NULL, _T("test.bmp") ); // ウィンドウのデバイスコンテキストハンドルを取得する hDC = GetDC( hDlg ); // メモリデバイスコンテキストを作成する hCompatDC = CreateCompatibleDC( hDC ); // ロードしたビットマップを選択する GetObject(hBitmap, sizeof(BITMAP), &bmp); // ビットマップをウィンドウに転送する(表示する) if(hBitmap != NULL){ StretchBlt( hDC, 0, 0, 100, 100, hCompatDC, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY ); SendDlgItemMessage( hDlg, IDC_STATIC, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmap); } なのですが、これはメインウィンドウでは動くのですが、ダイアログボックスでは動かずこまっています。 どうか、助言のほどよろしくお願いします。

  • クライアント領域のコントロールが描画されない

    WindowsXP / VC2005 / VC++ MFCにてダイヤログベースの画像ビューワの作成を行っています。 機能としては、独自形式のバイナリファイルをダイヤログへドラッグ&ドロップすることにより、 メモリに描画した画像をクライアント領域へ転送して表示します。 こちらが疑問点となるところなのですが、その際にもともと配置していた エディットボックスやスピンボタンなどのコントロールが消えてしまいます。 (見えなくてもボタンを押すことはできるので描画の問題と思われます) 1.なぜこのようなことが起こるのでしょうか? 2・また、コントロールを消さないためにはどうすればよいのでしょうか? 上記に関してご回答いただけると幸いです。 個人的な考えとしては、  1.クライアント領域を描画する際にコントロールを消してしまっている  2.再描画することによりコントロールは表示される(但し問題点としてクライアント領域を書き換える際にちらつく) です。 以下該当関数です //------------------------------------------------------------------------------ void CTestBitBltDlg::OnDropFiles(HDROP hDropInfo) { char acFileName[256]; SHORT sRet; memset(acFileName, 0, sizeof(acFileName)); DragQueryFile(hDropInfo, 0, acFileName, sizeof(acFileName)); memcpy( g_acSpriteFileName, acFileName, 256 - 1 ); CRect rc; GetClientRect(&rc); CClientDC dc(this); CDC dcMem; dcMem.CreateCompatibleDC(&dc); CBitmap bmp; bmp.CreateCompatibleBitmap(&dc, rc.Width(), rc.Height()); CBitmap* pOldBmp = dcMem.SelectObject(&bmp); dcMem.FillSolidRect(&rc, RGB(0xC0, 0xC0, 0xC0)); // 本関数にてメインとなるメモリDCへの描画をおこなってます sRet = GetMemoryImage(g_acSpriteFileName, 0, &dcMem); if( sRet == FALSE ){ GetDefaultImage(&dcMem); } dc.BitBlt(0, 0, rc.Width(), rc.Height(), &dcMem, 0, 0, SRCCOPY); dcMem.SelectObject(pOldBmp); //InvalidateRect(FALSE); CDialog::OnDropFiles(hDropInfo); } //------------------------------------------------------------------------------ なお、OnEraseBkgnd関数においてはTRUEのみを返すようにしてます。

専門家に質問してみよう