Desktopイメージをメモリに取り込む方法

このQ&Aのポイント
  • Visual C++のMFCを使って、デスクトップイメージをメモリに取り込むプログラムを作成しています。しかし、作成したプログラムで取得したColorBufの内容がすべてゼロになってしまいます。
  • MFCのAppWizardを使用し、SDIのスケルトンを作成しました。メニューバーにViewTestという項目を追加し、ここでデスクトップイメージをキャプチャしようとしています。
  • プログラム内でDesktopWindowのClient領域の座標を取得し、CreateCompatibleBitmap関数でbitmapを作成しています。しかし、bitmapの内容を取得するGetBitmapBits関数で取得したcolorBufの内容がすべてゼロになってしまいます。
回答を見る
  • ベストアンサー

デスクトップイメージをメモリに取り込むには

今、Visual C++ のMFCで、デスクトップイメージをメモリに取り込むプログラムを作り始めています。 DeskTopWindowをいじるのははじめてです。 とりあえず、MFCのAppWizardで、SDIのスケルトンを作り、まずは、テストのため、メニューバーの表示のところに、ID_VIEW_TESTというのをつくって、ここで、キャプチャーしようとしました。 そして、簡単に、 void CMainFrame::OnViewTest() { CRect rect; CWnd* pwWnd = GetDesktopWindow(); pwWnd->GetClientRect( &rect ); CDC* pwDC = pwWnd->GetDC(); CBitmap bm; bm.CreateCompatibleBitmap( pwDC, rect.Width(), rect.Height() ); unsigned char *colorBuf; colorBuf = (unsigned char *)malloc( sizeof( unsigned char ) * rect.Width() * rect.Height() * 3 ); bm.GetBitmapBits( rect.Width() * rect.Height() * 3, colorBuf ); pwWnd->ReleaseDC( pwDC ); } というプログラムを作り、colorBufの中身をみたら、どうやってもすべてゼロになっています。 rectには、ちゃんとデスクトップサイズが入っています。 なにが悪いのでしょうか。

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

  • ベストアンサー
回答No.3

 こんばんは。  デスクトップイメージをbmに対して描画していないのが原因なのではないでしょうか。  CreateCompatibleBitmap()と言うのは、あくまで指定したデバイスコンテキストと同一のフォーマットを持ったビットマップを作成するだけですので、イメージまで複写してくれる訳ではありません。  自前でビットブロック転送をしてイメージを複写する必要があります。  以下で改善しませんか。 void CMainFrame::OnViewTest() { CRect rect; CWnd* pwWnd = GetDesktopWindow(); pwWnd->GetClientRect( &rect ); CDC* pwDC = pwWnd->GetDC(); CBitmap bm; bm.CreateCompatibleBitmap( pwDC, rect.Width(), rect.Height() ); //デスクトップイメージをbmへ描写する CDC memDC; memDC.CreateCompatibleDC(pwDC); CGdiObject* pOld = memDC.SelectObject(&bm); memDC.BitBlt(0, 0, rect.Width(), rect.Height(), pwDC, 0, 0, SRCCOPY); memDC.SelectObject(pOld); memDC.DeleteDC(); //受け取りバッファに必要なバイトサイズを受け取る const DWORD dwBytes = bm.GetBitmapBits( 0, NULL ); //実際に割り当てる unsigned char *colorBuf = (unsigned char *)malloc(dwBytes); //イメージをバッファに受け取る bm.GetBitmapBits( dwBytes, colorBuf ); pwWnd->ReleaseDC( pwDC ); for(DWORD dw = 0; dw < dwBytes; ++dw) { if(colorBuf[dw] != 0) { //此処で確認 } } }

chachakabu
質問者

お礼

お返事ありがとうございました。 とりあえず、このプログラムでやってみたら、colorBufに値が入っていますね。 正しい値かどうか、ちょっとじっくり調べてみます。 それにしても、 CDC* pwDC = pwWnd->GetDC(); の直後にためしに、pwDC->GetPixel(x, y) で値をとってみても、FFFFFFFFしか返ってこなかったのは、なぜなのでしょうか。

chachakabu
質問者

補足

確認してみました。 colorBuf内に入っている値をもとに、SDIの画面に描画させてみたら、ちゃんと、デスクトップの絵が表示されました。 ありがとうございました。 CDC* pwDC = pwWnd->GetDC(); の直後にためしに、pwDC->GetPixel(x, y) で値をとってみても、FFFFFFFFしか返ってこなかったのはなぜなのでしょうか。 もしよろしければ、教えてください。

その他の回答 (3)

回答No.4

 こんにちは。御礼頂きました。  以下で試してみましたが、確かに失敗します。 CRect rect; CWnd* pwWnd = GetDesktopWindow(); pwWnd->GetClientRect( &rect ); //デスクトップウィンドウのデバイスコンテキストを取る CDC* pwDC = pwWnd->GetDC(); //ディスプレイのデバイスコンテキストを取る HDC hDC = ::CreateDC("DISPLAY", NULL, NULL, NULL); for(int y = 0; y < rect.Height(); ++y) { for(int x = 0; x < rect.Width(); ++x) { //成功 const COLORREF color = ::GetPixel(hDC, x, y); //失敗 const COLORREF color2= pwDC->GetPixel(x, y); } }  デスクトップウィンドウのデバイスコンテキストとディスプレイのデバイスコンテキストは別物の様に見えます。  流石に此の辺りの詳細を説明してくれる書籍を見つけた事が無い為、此れに関しては当方の理解範囲を超えているので何故だかは分かりません。  海外から輸入されたwindowsプログラム専門の書籍であればこの辺りの事情が書かれているかもしれません。

chachakabu
質問者

お礼

早速のお返事ありがとうございました。 ほんと、CDCに関しては、いつもややこしくて、勉強をするのもめんどくさく、なかなか深く掘り下げて勉強していないので、苦労しております。 ちゃんと勉強しろよ、と自分にいいながら、、、 でも、hDCをとって、成功した、というのは、大変興味深く、勉強になりました。 ありがとうございました。 わたしは、実は、マルチモニタでの画面キャプチャがしたいのです。 このプログラムでは、マルチモニタには対応していないようです。 これもわかりません。 近く、また別途、質問させていただきますので、ご縁があれば、またよろしくお願いいたします。

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.2

良く良く考えたら、手元にMFCどころか開発環境自体無かった…。 うろ覚えですが、DCに対してビットマップオブジェクトを選択していないような。 pwDC->SelectObject(&bm) とかがGetBitmapBitsの前に要らなかったか?って気がします。 古いオブジェクトは保存しておき、処理後に戻す方が良いです。

chachakabu
質問者

お礼

お返事ありがとうございます。 関係なさそうです。 CDC* pwDC = pwWnd->GetDC(); で、pwDCを作った後、GetPixelを使ってカラー値をみようと思い、 COLORREF px[10000]; long lx, ly, l; lx = ly = 0; for( l = 0; l < 10000; l++ ) { px[l] = pwDC->GetPixel( lx++, ly ); if( lx >= 500 ) { lx = 0; ly++; } } というソフトを追加してみました。 すると、pxの配列の中身はすべて、0xFFFFFFFFになっていました。 pwDCの取り方に問題があるのかもしれません。

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.1

> rectには、ちゃんとデスクトップサイズが入っています。 であればその後の、 pwDCにデバイスコンテキストの値が入っているか? bmにCreateCompatibleBitmapした結果は成功しているか? colorBufへのmallocは成功しているか? bmにGetBitmapBitsした結果は成功しているか? など確認するのが一般的なデバッグ方法です。

chachakabu
質問者

お礼

お返事ありがとうございました。 pwDC, pwWndには、ちゃんと中身も入っています。 CreateCompatibleBitmapは、TRUEを返しています。 mallocは成功しているかどうかわかりませんが、colorBufにはちゃんとアドレスが入っているので大丈夫でしょう。 GetBitmapBitsは、取得したバイト数、3072000を返り値として、返しています。 つまり、とりあえず、すべてのコマンドはちゃんと成功しているように見えます。 なので、何かが抜けているのか、Bitmapへのコピーでどこかが間違っているのか、pwDCの取り方が間違っているのか、、、 わたしもいろいろ調べてみましたが、よくわかりません。

関連するQ&A

  • マルチモニタのデスクトップイメージを取るには?

    VisualC++です。 デスクトップイメージを取得するため、 CMainFrm内で、 CRect rect; CWnd* pwWnd = GetDesktopWindow(); pwWnd->GetClientRect( &rect ); CDC* pwDC = pwWnd->GetDC(); とやって、このpwDCを使ってイメージを取得することに成功しました。 しかし、この方法では、シングルモニタの場合のみ成功し、マルチモニタでは、メインモニタのイメージのみが取れて、双方の画面のイメージはとれないようです。 わたしは今、モニタを2つ用意して、右側がメインモニタ、左側がサブモニタとしていますが、左側のモニタのイメージを取得するには、どうしたらよいでしょうか。 rectにも、メインモニタのサイズが入っています。 HDC hDC = ::CreateDC("DISPLAY", NULL, NULL, NULL); CDC* pwHDC = CDC::FromHandle( hDC ); とやって、このpwHDCを使っても、メインモニタのみのデスクトップイメージしかとれないようです。

  • クライアント領域を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(); }

  • icon format について

    Visual Studio.NET 2003 MFC を使用しています。 View画面で、アイコンを表示しようと思いました。 アイコン読み込みようのクラスを作成しました。 class icon { public: void IconHeadRead(FILE *fp,int *width,int *height) { unsigned char uc; unsigned short us; unsigned int ui; fread(&us,sizeof(unsigned short),1,fp); fread(&us,sizeof(unsigned short),1,fp); fread(&us,sizeof(unsigned short),1,fp); fread(&uc,sizeof(unsigned char),1,fp);*width=uc; fread(&uc,sizeof(unsigned char),1,fp);*height=uc; fread(&uc,sizeof(unsigned char),1,fp); fread(&uc,sizeof(unsigned char),1,fp); fread(&us,sizeof(unsigned short),1,fp); fread(&us,sizeof(unsigned short),1,fp); fread(&ui,sizeof(unsigned int),1,fp); }; void IconDataRead(FILE *fp,unsigned char *red,unsigned char *green,unsigned char *blue) { unsigned char uc; fread(&uc,sizeof(unsigned char),1,fp);*red=uc; fread(&uc,sizeof(unsigned char),1,fp);*green=uc; fread(&uc,sizeof(unsigned char),1,fp);*blue=uc; }; }; このred,green,blueの値を使用して、 SetPixelでドローしようと思いましたが、 変な表示になります。 width,heightは、正しいようです。 ICON フォーマットについて教えてください。 よろしくお願いします。 同じような要領で、bitmapは保存、読み込みはできました。

  • c言語でソーベルフィルタが作りたい

    c言語で画像処理のソーベルのフィルタが作りたいのですが、どうにもうまく動きません。おかしい点をご指摘していただけないでしょうか。一次元配列で作りたいです。 /*wiは読み込んだ画素値、woは書き出す画素値、m1,m2はフィルタ係数、widthは画像の幅、heightは画像の高さ*/ void sobel(unsigned char wi[], unsigned char wo[], char m1[],char m2[],int width, int height){ int i,j,k,l,z; unsigned char *w; unsigned char *wo2; w = (char*)malloc(sizeof(char)*(MW*MH)); wo2 = (char*)malloc(sizeof(char)*(MW*MH)); /*フィルタの適用*/ for(i=width+1; i<width*height; i++) wo[i]=wi[i-1-width]*m1[0]+wi[i-width]*m1[1]+wi[i+1-width]*m1[2]+wi[i-1]*m1[3]+wi[i]*m1[4]+wi[i+1]*m1[5]+wi[i-1+width]*m1[6]+wi[i+width]*m1[7]+wi[i+1+width]*m1[8]; for(j=width+1; j<width*height; j++) wo2[j]=wi[j-1-width]*m2[0]+wi[j-width]*m2[1]+wi[j+1-width]*m2[2]+wi[j-1]*m2[3]+wi[j]*m2[4]+wi[j+1]*m2[5]+wi[j-1+width]*m2[6]+wi[j+width]*m2[7]+wi[j+1+width]*m2[8]; for(k=width+1; k<width*height; k++) wo[k] = (unsigned char)sqrt(wo[k]*wo[k]+wo2[k]*wo2[k]); /*画素値を0から255に*/ for(l=width+1; l<width*height; l++){ if((unsigned char)wo[l] < 0) w[l] = 0; else if((unsigned char)wo[l] > 255) w[l] = 255; else w[l] = wo[l]; } for(z=width+1; z<width*height; z++) wo[z] = w[z]; free(w); free(wo2); } よろしくお願いしますm(_ _)m

  • PrintScreenKey押下でメモリはどこで取得?

    PrintScreenKey押下で mspaint(画像処理ソフト)で「貼り付け」をすると 画像が張り付けられますが、この過程をプログラミングしたいのですが どうしたらいいですか? どのようにOSメモリに保存された画像ポインタの先頭を取得 できますか? PrintScreenKeyをプログラミングするのは以下の様になるのは 知っています。 desktop=GetDesktopWindow();//デスクトップのハンドルを取得 GetWindowRect(desktop,&rc);//デスクトップのRECT情報を取得 width=rc.right; height=rc.bottom; //DIBの情報を設定する bmpInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER); bmpInfo.bmiHeader.biWidth=width; bmpInfo.bmiHeader.biHeight=height; bmpInfo.bmiHeader.biPlanes=1; bmpInfo.bmiHeader.biBitCount=32; bmpInfo.bmiHeader.biCompression=BI_RGB; //DIBSection作成 hdc=GetDC(hWnd); hBitmap=CreateDIBSection(hdc,&bmpInfo,DIB_RGB_COLORS,(void**)&lpPixel,NULL,0); hMemDC=CreateCompatibleDC(hdc); SelectObject(hMemDC,hBitmap); ReleaseDC(hWnd,hdc); fopen_s(&fpt,"ScreenCapture.bmp","wb"); //スクリーンをDIBSectionにコピー hdc=GetDC(desktop); BitBlt(hMemDC,0,0,width,height,hdc,0,0,SRCCOPY); ReleaseDC(desktop,hdc); BITMAPINFOHEADER bmih; BITMAPFILEHEADER bmfh; //RGBQUAD rgbquad; DWORD filesize,bmfhsize,bmihsize,rgbquadsize; bmfhsize=sizeof(bmfh); bmihsize=sizeof(bmih); //rgbquadsize=sizeof(rgbquad); filesize=bmfhsize+bmihsize+width*height; ::ZeroMemory(&bmfh, bmfhsize); ::ZeroMemory(&bmih, bmihsize); bmfh.bfType=0x4d42; bmfh.bfSize=filesize; bmfh.bfReserved1=0; bmfh.bfReserved2=0; bmfh.bfOffBits=bmfhsize+bmihsize; bmih.biSize=bmihsize; bmih.biWidth=width; bmih.biHeight=height; bmih.biPlanes=1; bmih.biBitCount=32; bmih.biClrUsed=2; bmih.biCompression=BI_RGB;//無圧縮形式 bmih.biSizeImage=0;//BI_RGBをセットした場合、0が好ましいとMSDNに書いてあった。 bmih.biXPelsPerMeter=0; bmih.biYPelsPerMeter=0; bmih.biClrImportant=0; fwrite(&bmfh,sizeof(unsigned char),bmfhsize,fpt); fwrite(&bmih,sizeof(unsigned char),bmihsize,fpt); fwrite(lpPixel,sizeof(DWORD),width*height,fpt);

  • RGBをCMYKに変換するプログラム

    Windows7 VS2008 SP1 RGBからCMYKに変換するプログラムを以下の様に書いている ([詳解]画像処理プログラミング という本に載っている ソースです) のですがうまくいきません。 おそらく型の扱い??だと思うのですが・・ 具体的にどの部分を修正すればいいのかご指摘お願いします。 INPUT:24bpp raw int RawToCMYK(WCHAR *filename,int width,int height) { FILE *fpt; FILE *fpt_C,*fpt_M,*fpt_Y,*fpt_K; unsigned char *layer; unsigned char *C,*M,*Y,*K; int i,j; _wfopen_s(&fpt,filename,L"rb"); if(fpt==0x00) { MessageBox(NULL,L"RawToCMYK Error",L"RawToCMYK Error",MB_OK); return -1; } else { layer=(unsigned char*)malloc(3*width*height); C=(unsigned char *)malloc(width*height); M=(unsigned char *)malloc(width*height); Y=(unsigned char *)malloc(width*height); K=(unsigned char *)malloc(width*height); fread(&layer[0],sizeof(unsigned char),3*width*height,fpt); fclose(fpt); _wfopen_s(&fpt_C,L"RawToC.raw",L"wb"); _wfopen_s(&fpt_M,L"RawToM.raw",L"wb"); _wfopen_s(&fpt_Y,L"RawToY.raw",L"wb"); _wfopen_s(&fpt_K,L"RawToK.raw",L"wb"); for(i=0;i<3*width*height;i+=3*width) { for(j=0;j<3*width;j+=3) { C[i/3+j/3]=255-layer[i+j]; M[i/3+j/3]=255-layer[i+j+1]; Y[i/3+j/3]=255-layer[i+j+2]; K[i/3+j/3]=min3(C[i/3+j/3],M[i/3+j/3],Y[i/3+j/3]); if(K[i/3+j/3]==0xff) { C[i/3+j/3]=0x00; M[i/3+j/3]=0x00; Y[i/3+j/3]=0x00; } else { C[i/3+j/3]=(C[i/3+j/3]-K[i/3+j/3])*255/(255-K[i/3+j/3]); M[i/3+j/3]=(M[i/3+j/3]-K[i/3+j/3])*255/(255-K[i/3+j/3]); Y[i/3+j/3]=(Y[i/3+j/3]-K[i/3+j/3])*255/(255-K[i/3+j/3]); } } } fwrite(&C[0],sizeof(unsigned char),width*height,fpt_C); fwrite(&M[0],sizeof(unsigned char),width*height,fpt_M); fwrite(&Y[0],sizeof(unsigned char),width*height,fpt_Y); fwrite(&K[0],sizeof(unsigned char),width*height,fpt_K); fclose(fpt_C); fclose(fpt_M); fclose(fpt_Y); fclose(fpt_K); free(C); free(M); free(Y); free(K); return 0;

  • オブジェクトの削除について

    環境 WIN98 VC++6.0 MFC にて オブジェクトを使い終わってから削除している場合としていない場合が有るのですが、どうしてなのですか? 作ったオブジェクトはなんでもかんでも削除したほうが無難な気がしますが、本にのっているコードで削除してない場合も良く見かけます。 <削除していない>//著名な本のコード void Cxxx::OnDraw(CDC* pDC) {  CBitmap bmp;  bmp.LoadBitmap(nID);  略  //bmp.DeleteObject(); //■この記述が無い } <削除している>//ネット上でみかけたコード void CMainFrame::_SetBmp(CWnd* pBox,int nID,int  width,int height) // 単品 {  CDC* pDC=pBox->GetDC();  CDC memDC;  CBitmap bmp;  bmp.LoadBitmap(nID);  memDC.CreateCompatibleDC(pDC);  CBitmap* pOldBmp=memDC.SelectObject(&bmp);  pDC->BitBlt(0,0,width,height,&memDC,0,0,SRCCOPY);  memDC.SelectObject(pOldBmp);  bmp.DeleteObject();  memDC.DeleteDC(); }

  • PrintScreenしたあとに画像を保存する方法

    LRESULT CALLBACK WndProcScreenCapture(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { // MMTIME mm; // CommonClass Common; static int id,x,y; HDC hdc; PAINTSTRUCT ps; static HBRUSH hBrush; HWND desktop; RECT rc; static int width,height; static BITMAPINFO bmpInfo; static LPDWORD lpPixel; static HBITMAP hBitmap; static HDC hMemDC; FILE *fpt; int i,j; //clock_t start,end; switch (message) { case WM_CREATE: desktop=GetDesktopWindow();//デスクトップのハンドルを取得 GetWindowRect(desktop,&rc);//デスクトップのRECT情報を取得 width=rc.right; height=rc.bottom; //DIBの情報を設定する bmpInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER); bmpInfo.bmiHeader.biWidth=width; bmpInfo.bmiHeader.biHeight=height; bmpInfo.bmiHeader.biPlanes=1; bmpInfo.bmiHeader.biBitCount=32; bmpInfo.bmiHeader.biCompression=BI_RGB; //DIBSection作成 hdc=GetDC(hWnd); hBitmap=CreateDIBSection(hdc,&bmpInfo,DIB_RGB_COLORS,(void**)&lpPixel,NULL,0); hMemDC=CreateCompatibleDC(hdc); SelectObject(hMemDC,hBitmap); ReleaseDC(hWnd,hdc); fopen_s(&fpt,"20090715.raw","wb"); fwrite((void**)&lpPixel[0],sizeof(unsigned char),width*height,fpt); /* DIBSectionにグラデーション描画 */ for (i = 0;i < height;i++) { for (j = 0;j <width;j++) { #if 0 /* DIBピクセル列に直接アクセス */ lpPixel[i + j * 256] = (i << 16); lpPixel[i + (j + 32) * 256] = (i << 8); lpPixel[i + (j + 64) * 256] = i; lpPixel[i + (j + 96) * 256] = (i << 16) | (i << 8) | i; /* GDI経由で描画 */ SetPixel(hMemDC, i, j + 128, RGB(i, 0, 0)); SetPixel(hMemDC, i, j + 128 + 32, RGB(0, i, 0)); SetPixel(hMemDC, i, j + 128 + 64, RGB(0, 0, i)); SetPixel(hMemDC, i, j + 128 + 96, RGB(i, i, i)); #endif } } //fwrite(&(bmpInfo.bmiHeader),sizeof(unsigned char),40,fpt); //fwrite((void**)&lpPixel,sizeof(unsigned char),width*height,fpt); //fwrite(&(bmpInfo.bmiColors),sizeof(unsigned char),width*height,fpt); fclose(fpt); //スクリーンをDIBSectionにコピー hdc=GetDC(desktop); BitBlt(hMemDC,0,0,width,height,hdc,0,0,SRCCOPY); ReleaseDC(desktop,hdc); break; case WM_DESTROY: //自らlpPixelを解放するべからず DeleteDC(hMemDC); DeleteObject(hBitmap); //BMPを削除した時、lpPixelも自動的に解放される PostQuitMessage(0); break; case WM_PAINT: hdc=BeginPaint(hWnd,&ps); BitBlt(hdc,0,0,width,height,hMemDC,0,0,SRCCOPY); EndPaint(hWnd,&ps); break; case WM_CHAR: の様に書いて、windowにキャプチャ画像を表示することは できたのですが、 この画像の画像情報のピクセルのポインタはどれなのでしょうか? 画像をraw形式でもいいので保存したいのですが、 どうしたら、キャプチャした画像を ファイルとして保存 できますか? //fwrite((void**)&lpPixel,sizeof(unsigned char),width*height,fpt); ではうまくいきませんでした。

  • Formにエディットボックスを貼りたい

    環境はWIN98 VC++6.0 MFC SDIです。 クラスウィザードのデフォルトでSDIを作ります。 但し、6/6ページの基本クラスはCFormViewにします。 このForm上にプログラム上からエディットボックスを貼りつけるために、以下のようにしましたが、エディットボックスらしき白い四角は出来ましたが文字の入力が出来ません。 どうすればよいのでしょうか? static contID = 4000; ///////////////////////////////////////////////// int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { 略   CRect rect;   // CTestWndの上にCEditを貼り付ける   rect.top = 30;   rect.left = 30;   rect.bottom = 100;   rect.right = 100;   CEdit* edit = new CEdit();      if( edit->Create(WS_CHILD|WS_VISIBLE|WS_TABSTOP,   rect,   this,   contID++ ) != TRUE ){     throw new CException();   }   return 0; }

  • デスクトップに貼り付けたパネルを背面に移動したい

    Form1とは独立してデスクトップにPanelを貼り付けているのですが このPanelを他のアプリのウィンドウの背面に移動したいと思っています。 どのようにしたら、良いでしょうか。 Form1については以下のように最背面にすることは出来るのですが 独立したPanelは移動できずに困っています。 下記のHandleの部分をPanel->Handleとしてもだめでした。 SetWindowPos(Handle, HWND_BOTTOM,Left ,Top , Width,Height, SWP_SHOWWINDOW); Panelは以下のようにしてデスクトップに貼り付けています。 Panel->ParentWindow=GetDeskTopWindow(); ご存知の方、宜しくお願いします。

専門家に質問してみよう