プリンタのBMP領域のサイズは?

このQ&Aのポイント
  • プリンタのBMP領域のサイズを設定する方法が分からない
  • プリンタと同じメモリDCを作り、そこに書き込んだものをBitBltでコピーして印刷する際、BMP領域のサイズをどこで設定すれば良いのか分からない
  • 困っております、ご指導願います
回答を見る
  • ベストアンサー

プリンタBMP領域のサイズは?

プリンタと同じメモリDCを作り、そこに書き込んだものをBitBltでコピーして印刷します ← サンプルのコードを参照させて頂きましたので多分間違えは無いと思います ところが確保すべきBMP領域(プリンタのサイズ)が分りません ?????????の箇所に設定すべき定数は何処を参照すれば良いのでしょうか? 困っております、ぜひご指導願います HDC hdc; DOCINFO docinfo; memset(&docinfo, 0, sizeof(DOCINFO)); docinfo.cbSize = sizeof(DOCINFO); docinfo.lpszDocName = L"testprint"; hdc = CreateDC(L"EPMJ3", L"Canon MP280 series Printer", NULL, NULL); StartDoc(hdc, &docinfo); StartPage(hdc); HDC hdcMem = CreateCompatibleDC (hdc); int Xsize = ???????????????? int Ysize = ???????????????? HBITMAP hDrawBmp =CreateCompatibleBitmap(hdc,Xsize,Ysize); SelectObject (hdcMem,hDrawBmp); TextOut(hdcMem, 0, 0 , L"プリンタのBMP領域の大きさは何処で分りますか?", 100); BitBlt(hdc, 0, 0,Xsize, Ysize, hdcMem, 0, 0, SRCCOPY); EndPage(hdc);

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

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

GetDeviceCaps関数にHORZRES、VERTRESを渡せば求められます。 GetDeviceCaps http://msdn.microsoft.com/ja-jp/library/cc428670.aspx

sato-may
質問者

お礼

ご指導ありがとうございます ドンピシャリ!のご回答、一発で解決致しました 今後も宜しくお願い申し上げます ありがとうございました

関連するQ&A

  • スクリーンキャプチャしてBMP保存する方法を教えてください

    ダイアログでボタンを押すとスクリーンキャプチャしてBMPファイルとして保存したいのですが、うまく動作しません。 どこがまずいのでしょうか?教えていただけると、嬉しいです。 void Test::OnScreenSave() { HDC hScreenDC; HDC hMemDC; HBITMAP hMemBmp; int scrx, scry; int xsize,ysize; RECT rect; HBITMAP hOld; GetWindowRect(&rect); scrx = GetSystemMetrics(SM_CXSCREEN); scry = GetSystemMetrics(SM_CYSCREEN); hScreenDC = CreateDC("DISPLAY", NULL, NULL, NULL); xsize = rect.right -rect.left; ysize = rect.bottom - rect.top; hMemDC = CreateCompatibleDC(hScreenDC); hMemBmp = CreateCompatibleBitmap(hScreenDC, xsize, ysize); hOld = (HBITMAP)SelectObject(hMemDC, hMemBmp); BitBlt(hMemDC, 0, 0, xsize, ysize, hScreenDC, rect.left, rect.top, SRCCOPY); int nWid3 = (xsize * 3 + 3) & 0xfffffffc; int nBmp = nWid3 * ysize; BYTE *p = new BYTE[nBmp + 54]; SelectObject(hMemDC, hOld); // hMemBmpを非選択とする int lines = GetDIBits(hMemDC, hMemBmp, 0, ysize, (LPBYTE)(p + 54), (LPBITMAPINFO)(p + 14), DIB_RGB_COLORS); // lines -> 0 となり、何もコピーされない。 if(OpenClipboard() != 0){ EmptyClipboard(); SetClipboardData(CF_BITMAP, hMemBmp); // この処理は正常に実行されている CloseClipboard(); } DeleteDC(hMemDC); DeleteDC(hScreenDC); delete [] p; }

  • スクリーンキャプチャしてBMPファイルに保存する方法を教えて下さい

    スクリーンキャプチャしてBMPファイルに保存する方法を教えて下さい. ダイアログでボタンを押したらスクリーンキャプチャして、それをBMPファイルで保存したいのですがうまく動作しません。 ダイアログ画面のサイズは、横 659 画素、縦 486 行です。 GetDIBits()で162行まではコピー出来るのですが、それ以上ではエラーを起こします。 クリップボードに貼り付ける処理は正常に動作しています。 どこがまずいのかを教えていただけたら嬉しいです。 よろしくお願い致します。 void Test::OnScreenSave() { HDC hScreenDC; HDC hMemDC; HBITMAP hMemBmp; int scrx, scry; int xsize,ysize; RECT rect; HBITMAP hOld; GetWindowRect(&rect); scrx = GetSystemMetrics(SM_CXSCREEN); scry = GetSystemMetrics(SM_CYSCREEN); hScreenDC = CreateDC("DISPLAY", NULL, NULL, NULL); xsize = rect.right -rect.left; ysize = rect.bottom - rect.top; hMemDC = CreateCompatibleDC(hScreenDC); hMemBmp = CreateCompatibleBitmap(hScreenDC, xsize, ysize); hOld = (HBITMAP)SelectObject(hMemDC, hMemBmp); BitBlt(hMemDC, 0, 0, xsize, ysize, hScreenDC, rect.left, rect.top, SRCCOPY); int nWid = (xsize * 3 + 3) & 0xfffffffc; int nBmp = nWid * ysize; LPBYTE p = new BYTE[nBmp + 54]; LPBYTE pImg = (LPBYTE)(p + 54); LPBITMAPINFO pInfo = (LPBITMAPINFO)(p + 14); pInfo->bmiHeader.biSize=sizeof(BITMAPINFOHEADER); pInfo->bmiHeader.biWidth=nWid; pInfo->bmiHeader.biHeight=ysize; pInfo->bmiHeader.biPlanes=1; pInfo->bmiHeader.biBitCount=24; pInfo->bmiHeader.biCompression=BI_RGB; // 非圧縮フォーマット BI_RGB = 0 SelectObject(hMemDC, hOld); // hMemBmpを非選択とする int lines = GetDIBits(hMemDC, hMemBmp, 0, 162, pImg, pInfo, DIB_RGB_COLORS); // 162ラインまではコピー出来るが、それ以上ではエラーとなる。 if(OpenClipboard() != 0){ EmptyClipboard(); SetClipboardData(CF_BITMAP, hMemBmp); // この処理は正常に実行されている CloseClipboard(); } DeleteDC(hMemDC); DeleteDC(hScreenDC); delete [] p; }

  • UNICODE指定のプロジェクトで関数Wの呼出し?

    .NET VC++で簡単な印刷プログラムを作りました hdc = CreateDC(TEXT("EPMJ3"), TEXT("Canon MP280 series Printer"), NULL, NULL);・・・(1) StartDoc(hdc, &docinfo);                           ・・・(2) StartPage(hdc); TextOut (hdc, 10, 200,L"テスト印刷の1行目です。", 12);           ・・・(3) TextOutW(hdc, 10, 100,L"テスト印刷の2行目です。", 12);           ・・・(4)  EndPage(hdc); EndDoc(hdc); DeleteDC(hdc); プロジェクトの文字コードはUNICODEを指定しております (1)はCreateDocW関数 (2)はStartDocW関数が呼ばれます (3)は当然TextOutW関数になるだろうと思っていたら、TextOutA関数が呼ばれいます 試しに(4)のように直接TextOutW関数を指定してみたら、これも結果に於いてTextOutA関数が呼ばれています    【以上の事柄はAPIフックを仕掛けて調べました】 なぜ私のコンパイラはUNICODE用のTextOut関数を呼出してくれないのですか????

  • AlphBlendとExcel???

    自社で作成した特定の印刷プログラム(4ケあります)とWord全部の印刷ドキュメントには取扱注意を要する情報が印刷されています これらの特定印刷プログラムやWordで印刷したドキュメントの取扱注意を促すため、用紙全体を薄い黄色に印刷しています まるで用紙全体に黄色いカバーを掛けたように見えますので、充分な注意喚起が出来ます 黄色いカバーをする方法は以下のように単純です 印刷開始のトリガーになるAPIであるEndPageにAPIフックを仕掛けます 【APIフックは ADVANCED WINDOWS 著者 Jeffrey Ricther 発刊元 Microsoft社 を参考にさせて頂きました】 EndPageをフックしたらプログラムが自社開発した特定印刷プログラム、またはWord文書であるか否かを判定します これにはGetModuleFileNameWを呼出し、戻り値の内容を調べます リスト(1)を箇所です 4ケの特定印刷プログラム、Word文書である際には次の処理(薄い黄色でカバー)に流し、他の場合にはいきなり(3)の本物のEndPageに移します 薄い黄色でカバーする方法は、まずプリンターと同じメモリーDCを作ります そのメモリーDC全体を黄色に塗り潰します メモリーDCに作った黄色イメージを10%の透明度でプリンタ領域に上書きします すると実際に印刷された用紙は取扱注意を促す黄色になります 具体的なフックプロセスの主要部分は次の通りです 【実際にはもっとゴチャゴチャしていますが、話を単純化するため枝葉をカットしてあります】 int WINAPI Hook_EndPage(HDC hdc) { (1)GetModuleFileNameWでプログラム名を調べ、特定の印刷プログラム・Word文書であれば次の処理をする もし異なればイキナリ(3)へ飛ばします int Xsize = GetDeviceCaps(hdc, HORZRES); //プリンタの領域サイズを調べる int Ysize = GetDeviceCaps(hdc, VERTRES); hdcMemDC = CreateCompatibleDC(hdc); //プリンタと同じメモリーDCを作る HBITMAP hDrawBmp = CreateCompatibleBitmap(hdc,Xsize,Ysize); //調べたプリンタサイズと同 一のビットマップを作る SelectObject (hdcMemDC, hDrawBmp); //ビットマップをメモリーDCに結び付ける HPEN NEWPEN,OLDPEN; NEWPEN = CreatePen(PS_DASH, 2, RGB(255,255,000)); //黄色ペンを作る OLDPEN = (HPEN)SelectObject(hdcMemDC,NEWPEN); //作った黄色ペンをメモリーDCに結び付ける HBRUSH NEWBRUSH,OLDBRUSH; NEWBRUSH = CreateSolidBrush(RGB(255,255,000)); //黄色のブラシを作る OLDBRUSH = (HBRUSH)SelectObject(hdcMemDC,NEWBRUSH); //作った黄色ブラシをメモリーDCに結び付ける Rectangle(hdcMemDC,0,0,Xsize,Ysize); //黄色ペン、ブラシでメモリーDC全体を真黄色にする SelectObject(hdcMemDC,OLDPEN); //ペンとブラシを元に戻す SelectObject(hdcMemDC,OLDBRUSH); ここを(2)とします(後で説明します)   //メモリーDCに作成した黄色イメージ全体を10%の透明度でプリンタ領域に上書きする BLENDFUNCTION blendFunction; ::memset (&blendFunction, 0, sizeof(blendFunction)); //ゼロクリア   blendFunction.BlendOp = AC_SRC_OVER;   blendFunction.BlendFlags = 0; blendFunction.SourceConstantAlpha = 256/10;  ← 10%の透明度を指定   blendFunction.AlphaFormat = 0;   bool rtn = AlphaBlend(hdc, 0, 0, Xsize, Ysize, hdcMemDC, 0, 0, Xsize, Ysize, blendFunction);   //オリジナルEndPageを呼び出す   int nResult = ((PFNENDPAGE)(PROC) g_EndPage)(hdc);   (3)   return nResult; } このEndPageフックを仕掛けるとC#、C++で作った自社の特定印刷プログラムと全てのWord文書は意図した通り黄色いカバーが掛って印刷されます ところが今回、Excel文書も黄色いカバーを掛けることになりました (1)の箇所でExcelも選別してやればOKになるだろうと安易に考えていましたが、実際にテストしてみると次のような現象が発生してNGなのです Excel文書は従前のごとく印刷されます(黄色いカバーが掛っていません) 次に10%の透明度で印刷された黄色い用紙が出てきます すなわちプリンタ領域に出力されたExcel文書とメモリーDCの黄色いイメージが重ならず別々に印刷されてしまいます このとき印刷中のExcel画面には   現在1/1ページを印刷中です   ⇒ 添付画像を参照ください と表示されますので、Excel自体は1ページの文書を印刷しているつもりなのでしょう Excel文書の後に黄色いカバーがくっついていると思っているのでしょう なぜAlphBlend APIはメモリーDCイメージをExcelプリンター領域に重ねてくれないのでしょうか? まるでExcelが自分の出力領域にロックを掛けているような印象です 念の為、(2)に SetTextAlign (hdc, 0);    //テキスト配置オプションではカレントポジションを使用しない MoveToEx(hdc, 0, 0, NULL);  //カレントポジションをゼロに戻す の2ラインを入れて、印刷カレントポジションを原点に戻しても結果は同一でした 質問】 1. なぜExcel文書だけ黄色いカバーが重ならないのでしょうか? 2. Excelの印刷範囲指定操作    印刷するセルを選択 ⇒ ページレイアウト ⇒ 印刷範囲 ⇒ 印刷範囲の設定 が関係しているのではないかとの参考意見を同僚がくれました では上記の操作はどのようなAPIを出しているのでしょうか? もしそのAPIが分かればフックして調べてみたいと思います このExcel文書に黄色いカバーを掛けることで相当な時間を費やしてしまいました でも手掛かりが全くなく困っております どんなヒントでも結構です、ぜひ教えてください、お願い申し上げます

  • C++/CLIで印刷する画像が表示されない

    filenameで指定したbmpファイルを印刷させるプログラムを作っているのですが、 どうやっても指定したファイル名のアドレスの画像が表示されなくて困っています。 どうやったら良いのでしょうか?? bool printFile(char *filename) { PRINTDLG pd; DOCINFO di; HWND hWnd; HDC hBuffer; static HBITMAP hBitmap; //プリンタの設定 memset(&pd, 0, sizeof(PRINTDLG)); pd.lStructSize = sizeof(PRINTDLG); pd.hwndOwner = NULL; pd.hDevMode = NULL; pd.hDevNames = NULL; pd.Flags = PD_USEDEVMODECOPIESANDCOLLATE | PD_RETURNDC | PD_NOPAGENUMS | PD_NOSELECTION | PD_HIDEPRINTTOFILE| PD_RETURNDEFAULT; pd.nCopies = 1; pd.nFromPage = 1; pd.nToPage = 1; pd.nMinPage = 1; pd.nMaxPage = 1; memset(&di, 0, sizeof(DOCINFO)); di.cbSize = sizeof(DOCINFO); di.lpszDocName = filename; //印刷を実行 if (PrintDlg(&pd)==TRUE) { StartDoc(pd.hDC, &di); StartPage(pd.hDC); //描画を実行 int lnWidth = 2000; int lnHeight = 5000; HDC hMemDC = CreateCompatibleDC(pd.hDC); HBITMAP hBitmap = CreateCompatibleBitmap(pd.hDC,lnWidth,lnHeight); HBITMAP Obj = (HBITMAP)SelectObject(hMemDC,hBitmap); int iRet = GetDeviceCaps(hMemDC,RASTERCAPS); // コピー iRet = BitBlt(hMemDC,0,0,lnWidth,lnHeight,pd.hDC,0,0,SRCCOPY); EndPage(pd.hDC); EndDoc(pd.hDC); DeleteDC(pd.hDC); return true; } return false; }

  • BMPの保存

    プリントスクリーンをして、それをBMP形式で保存しようとしているのですが、保存後のファイルを開いてウィンドウを動かすと、それにつれ逐次、画像が更新されていきます。 この問題の原因がわかる方、助言をお願いします。 プログラムはC++で作成しています。 下にソースを載せています。 宜しくお願いします。 #include<windows.h> LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; static BITMAPINFO bmpInfo; static LPDWORD lpPixel; static HBITMAP hBitmap; static HDC hMemDC; HWND desktop; RECT rc; static int width,height; switch(uMsg) { case WM_CREATE: //スクリーンの情報を得る desktop=GetDesktopWindow(); GetWindowRect(desktop,&rc); 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); //スクリーンをDIBSectionにコピー hdc=GetDC(desktop); BitBlt(hMemDC,0,0,width,height,hdc,0,0,SRCCOPY); ReleaseDC(desktop,hdc); return 0; case WM_DESTROY: //自らlpPixelを解放するべからず DeleteDC(hMemDC); DeleteObject(hBitmap); //BMPを削除した時、lpPixelも自動的に解放される PostQuitMessage(0); return 0; case WM_PAINT: hdc=BeginPaint(hWnd,&ps); //表画面へ転送 BitBlt(hdc,0,0,width,height,hMemDC,0,0,SRCCOPY); EndPaint(hWnd,&ps); return 0; } SaveBitmap((HWND)hWnd,"PrintScreen.BMP"); return DefWindowProc(hWnd,uMsg,wParam,lParam); } int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR lpCmdLine,int nCmdShow) { WNDCLASS wc; MSG msg; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WindowProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = __FILE__; if(!RegisterClass(&wc)) return 0; HWND hWnd=CreateWindow( __FILE__,"スクリーンキャプチャ", WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, NULL,NULL,hInstance,NULL); if(hWnd==NULL) return 0; BOOL bRet; while((bRet=GetMessage(&msg,NULL,0,0))!=0){ if(bRet==-1) break; DispatchMessage(&msg); } return (int)msg.wParam; }

  • 透過済み画像を作りたい

    プログラムを始めたところの初心者です。 画像を透過し、ウインドウに表示させたいので、いろいろ探してみたところ、 マスクを自動で作成すると言う物があったので、参考にさせてもらいました。 さらに、その中に、『同じように透過済み画像を作れる』とあったので、いろいろ試したのですが、ダメでした・・・ よろしければ、やり方を教えていただけないでしょうか。 http://oshiete1.goo.ne.jp/qa5254128.html 上を参考にさせていただきました Dim hDC as HDC, hTemp As HDC, hDest as HDC,hOriDC As HDC Dim hBmpTemp as HBITMAP, dummy(3) as HBITMAP,hOriBmp As HBITMAP Dim bmp as BITMAP Dim hMemDC As HDC,hMemBmp As HBITMAP hDC=GetDC(NULL) hTemp=CreateCompatibleDC(hDC) hDest=CreateCompatibleDC(hDC) hOriDC=CreateCompatibleDC(hDC) hMemDC=CreateCompatibleDC(hDC) ReleaseDC(NULL,hDC) ' 元画像の情報の取得 GetObject(hBmp,Len(bmp),bmp) ' モノクロBITMAPの生成 hBmpTemp=CreateCompatibleBitmap(hDest,bmp.bmWidth,bmp.bmHeight) hOriBmp=CreateCompatibleBitmap(hOriDC,bmp.bmWidth,bmp.bmHeight) hMemBmp=hBmp dummy(0)=SelectObject(hTemp,hBmp) dummy(1)=SelectObject(hDest,hBmpTemp) dummy(2)=SelectObject(hOriDC,hOriBmp) dummy(3)=SelectObject(hMemDC,hMemBmp) SetBkColor(hTemp,GetPixel(hTemp,0,0)) ' 背景マスクの生成 BitBlt(hDest,0,0,bmp.bmWidth,bmp.bmHeight,hTemp,0,0,SRCCOPY) 'スプライト BitBlt(hOriDC,0,0,bmp.bmWidth,bmp.bmHeight,hDest,0,0,NOTSRCCOPY) BitBlt(hOriDC,0,0,bmp.bmWidth,bmp.bmHeight,hTemp,0,0,SRCAND) '透過 BitBlt(hMemDC,0,0,bmp.bmWidth,bmp.bmHeight,hDest,0,0,SRCAND) BitBlt(hMemDC,0,0,bmp.bmWidth,bmp.bmHeight,hOriDC,0,0,SRCPAINT) ' HBITMAPの切り離し SelectObject(hTemp,dummy(0)) SelectObject(hDest,dummy(1)) SelectObject(hOriDC,dummy(2)) SelectObject(hMemDC,dummy(2)) ' HDCの後始末 DeleteDC(hTemp) DeleteDC(hDest) DeleteDC(hOriDC) DeleteDC(hMemDC) ' 呼び出し元への返り値 MakeMaskWith=hMemBmp

  • HDCを他の領域にコピーするには?

    HDC hdc = CreateDC("WINSPOOL","プリンタの名前",NULL,NULL); ....(1)プリンタのHDCの作成 HDC hdcMemDC = CreateCompatibleDC(hdc); ....(2)前者と同じ仕様のメモリーHDCの作成 hdcとhdcMemDCはハンドラへのポインタだと思います hdc ....(ポインタ)....... hdcの内容 (A) hdcMemDC ....ポインタ.......hdcMemDCの内容 (B) もしBをA領域に書き写せば TextOut(hdc,0,0,"メモリーDCに書き込めると思います",100); とするとプリンタにではなくメモリ-DCに書込むと思います   ⇒ BをAに書き写さずTextOut(hdcMeMDC,0,0,"メモリーDCに書き込めると思います",100);と同じ結果になるでしょう ところが『BをAに書き写す』方法が分かりません ハンドラの構成、サイズなどの資料を探しましたが適当なものが見つかりません ご存知でしたら教えてください 【追加説明】 TextOut(hdc,0,0,"メモリーDCに書き込めると思います",100); のステートメントを TextOut(hdcMeMDC,0,0,"メモリーDCに書き込めると思います,100); にするには一般的にはAPIフックが必要になります ⇒ もちろん全ソースの手修正でも可能ですが...... APIフックも手修正も回避したいのです

  • ActiveBasic 透過画像の作り方

    ゲームを作っています。 そのときに、背景を透過した画像を作る関数を書いたのですが、どうしてもうまく処理が出来ません。 Function CreateMask(hBmp As HBITMAP) As HBITMAP Dim hDC As HDC Dim hBaseDC As HDC,hBaseBmp As HBITMAP Dim hMaskDC As HDC,hMaskBmp As HBITMAP Dim hTempDC As HDC,hTempBmp As HBITMAP Dim hCompDC As HDC,hCompBmp As HBITMAP Dim bmp As BITMAP Dim dummy[5] As HBITMAP hDC=GetDC(hMainWnd) hBaseDC=CreateCompatibleDC(hDC) hMaskDC=CreateCompatibleDC(hDC) hTempDC=CreateCompatibleDC(hDC) hCompDC=CreateCompatibleDC(hDC) GetObject(hBmp,len(bmp),bmp) hMaskBmp=CreateCompatibleBitmap(hMaskDC,bmp.bmWidth,bmp.bmHeight) hBaseBmp=CreateCompatibleBitmap(hDC,bmp.bmWidth,bmp.bmHeight) hCompBmp=CreateCompatibleBitmap(hDC,bmp.bmWidth,bmp.bmHeight) dummy[0]=SelectObject(hTempDC,hBmp) dummy[1]=SelectObject(hMaskDC,hMaskBmp) dummy[2]=SelectObject(hBaseDC,hBaseBmp) dummy[3]=SelectObject(hCompDC,hCompBmp) SetBkColor(hTempDC,GetPixel(hTempDC,0,0)) BitBlt(hMaskDC,0,0,bmp.bmWidth,bmp.bmHeight,hTempDC,0,0,NOTSRCCOPY) BitBlt(hBaseDC,0,0,bmp.bmWidth,bmp.bmHeight,hTempDC,0,0,SRCCOPY) BitBlt(hBaseDC,0,0,bmp.bmWidth,bmp.bmHeight,hMaskDC,0,0,SRCAND) BitBlt(hMaskDC,0,0,bmp.bmWidth,bmp.bmHeight,hMaskDC,0,0,NOTSRCCOPY) BitBlt(hCompDC,0,0,bmp.bmWidth,bmp.bmHeight,hMaskDC,0,0,SRCAND) BitBlt(hCompDC,0,0,bmp.bmWidth,bmp.bmHeight,hBaseDC,0,0,SRCPAINT) SelectObject(hTempDC,dummy[0]) SelectObject(hMaskDC,dummy[1]) SelectObject(hBaseDC,dummy[2]) SelectObject(hCompDC,dummy[3]) DeleteDC(hTempDC) DeleteDC(hMaskDC) DeleteDC(hBaseDC) DeleteDC(hCompDC) CreateMask=hCompBmp End Function とりあえず、いろいろと実験したところ、 背景を黒くしたもの(hBaseDC)とマスク画像(hMaskDC)はちゃんと出来ています。 おそらく問題なのは、 BitBlt(hCompDC,0,0,bmp.bmWidth,bmp.bmHeight,hMaskDC,0,0,SRCAND) BitBlt(hCompDC,0,0,bmp.bmWidth,bmp.bmHeight,hBaseDC,0,0,SRCPAINT) ここではないかと思っています。 これを処理すると、背景を黒くしたもの(hBaseDC)と同じものが出てきます。 これを透過するにはどうしたらいいのでしょうか? ご教授お願いします。 Win.XP AB 4.23.00

  • OnDraw以外でクライアント領域をBMPに保存できない

    いつもお世話になっています。 MFCでシミュレーション計算プログラムを作っていて クライアント領域の画像をBMPファイルに落とすため 下記サブルーチンを作成しましたが、 ファイルができません。 OnDraw関数に記述すると、 最初の1ステップ目のみファイルが出力されます??? どなたかアドバイス・参考URL等ご教示お願い致します。 また、他に有用なライブラリ等ありましたら、 URL等ご紹介いただければありがたいです。 void CMPSView::SaveBMP(HWND hwnd, char* filename) { DWORD dwSize,dwFSize,dwWidth,dwHeight,dwLength; HANDLE fh; LPBITMAPFILEHEADER lpHead; LPBITMAPINFOHEADER lpInfo; LPBYTE lpBuf,lpPixel; RECT rec; HDC hdc,hdcMem; HBITMAP hBMP,hOld; (中略:バッファ確保、ヘッダ作成) hdc = this->GetDC()->m_hDC; hBMP=CreateCompatibleBitmap(hdc,dwWidth,dwHeight); hdcMem=CreateCompatibleDC(hdc); hOld=(HBITMAP)SelectObject(hdcMem,hBMP); BitBlt(hdcMem,0,0,dwWidth,dwHeight,hdc,0,0,SRCCOPY); SelectObject(hdcMem,hOld); GetDIBits(hdc,hBMP,0,dwHeight,lpPixel,(LPBITMAPINFO)lpInfo,DIB_RGB_COLORS); ReleaseDC(this->GetDC()); DeleteObject(hBMP); DeleteObject(hdcMem); fh=CreateFile(filename, GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); WriteFile(fh,lpBuf,dwFSize,&dwSize,NULL); CloseHandle(fh); GlobalFree(lpBuf); }

専門家に質問してみよう