SetDIBitsToDeviceで88x31のpngを表示できない問題の解決方法

このQ&Aのポイント
  • SetDIBitsToDevice関数を使用して88x31のpngファイルを表示しようとしていますが、絵が表示されません。
  • 問題の原因は、BITMAPINFO構造体の設定にあります。正しい設定を行うことで解決できます。
  • 具体的には、BITMAPINFO構造体のbiBitCountの値を正しく設定する必要があります。
回答を見る
  • ベストアンサー

SetDIBitsToDeviceで88x31のpngを

表示しようとして int SetDIBitsToDevice( HDC hdc, int XDest,←0 int YDest,←0 DWORD dwWidth,←88 DWORD dwHeight,←31 int XSrc,←0 int YSrc,←0と31でトライ UINT uStartScan,←0 UINT cScanLines,←31 CONST VOID *lpvBits,←読み込んだpngのfufferポイ CONST BITMAPINFO *lpbmi,←&bmpInfo UINT fuColorUse←DIB_RGB_COLORS ); としました。ただし BITMAPINFO bmpInfoは bmpInfo.bmiHeader.biSize=40; bmpInfo.bmiHeader.biWidth=88; bmpInfo.bmiHeader.biHeight=31; bmpInfo.bmiHeader.biPlanes=1; bmpInfo.bmiHeader.biBitCount=0; bmpInfo.bmiHeader.biCompression=BI_PNG; bmpInfo.bmiHeader.biSizeImage=pngのbufferのsize; bmpInfo.bmiHeader.biXPelsPerMeter=0; bmpInfo.bmiHeader.biYPelsPerMeter=0; bmpInfo.bmiHeader.biClrUsed=0; bmpInfo.bmiHeader.biClrImportant=0; と定義しました。 (実際にdivファイルを表示できていたプログラムの関連部分の書き換え) が、絵がでません。 どの設定に問題があるのでしょうか?

  • keyguy
  • お礼率68% (895/1314)

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

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

JPEGのサンプルです。 おそらくpngも同じでしょう。 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_7378.asp あと、エラーになったときは、APIの戻り値、GetLastError()の値を書いてくださいね。 ぱっと見では、bmpInfo.bmiHeader.biSizeがおかしい気がしますが。

その他の回答 (4)

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

後のほうの参考urlの内容、よく読むとulはunsigned long というかDWORDですね。 なんで、サンプルはキャストが抜けてますね(^^;;;

keyguy
質問者

お礼

何度も調べてもらってありがとうございます。 マイクロソフトはもうけているのだからいい加減な例を出さないでほしいものですね。 そのままコンパイルすれば動く例を出さないのが不思議ですね。

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

ExtEscape() http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpgdi/html/_win32_extescape.asp >ulの型はどのようにすればいいのでしょうか? >int,unsigned,LPSTRではエラーになります。 ヘルプを見ると、LPSTRとかいてあります。 で、サンプルのパラメータを見ると&がついてます。 ということで、charでしょうね。 >2番目のExtEscapeは引数の順は大丈夫なのでしょうか? >(・・・,pvJpgImage,nJpgImageSize,・・・) (?_?)・・・ 逆みたいですね(^^;;; あと、こんなページもありました。 新たなキーワードがあったら再度検索してみるのもどうでしょう? http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/prntspol_5juc.asp

参考URL:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/prntspol_5juc.asp
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

一応参考までに・・・ >GetLastError()は87 winerror.hでは、 87 == ERROR_INVALID_PARAMETER The parameter is incorrect. FormatMessage()で日本語を取得すると、 「パラメータが間違っています。」 でした。

keyguy
質問者

補足

98seでサポートされているのかが疑わしくなってきました。 例の前段が気になります。 ul=CHECKJPEGFORMAT; if ( (ExtEscape(hD,QUERYESCSUPPORT,sizeof(ul),&ul,0,0)>0) && (ExtEscape(hD,CHECKJPEGFORMAT,pvJpgImage,nJpgImageSize,sizeof(ul),&ul)>0) && (ul == 1) ) において ulの型はどのようにすればいいのでしょうか? int,unsigned,LPSTRではエラーになります。 2番目のExtEscapeは引数の順は大丈夫なのでしょうか?(・・・,pvJpgImage,nJpgImageSize,・・・) よろしくお願いします。

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

>ぱっと見では、bmpInfo.bmiHeader.biSizeがおかしい気がしますが。 ここあってますね。失礼しました。 自分の中でWORDを4バイトで数えてました。

keyguy
質問者

お礼

SetDIBitsToDeviceの関数値が0になっていたのでエラーしている事が分かりました。 GetLastError()は87でした。

keyguy
質問者

補足

大変参考になる例のリンクありがとうございました。 例によると bmpInfo.bmiHeader.biSize=40; bmpInfo.bmiHeader.biWidth=88; bmpInfo.bmiHeader.biHeight=-31;//修正点 bmpInfo.bmiHeader.biPlanes=1; bmpInfo.bmiHeader.biBitCount=0; bmpInfo.bmiHeader.biCompression=BI_PNG; bmpInfo.bmiHeader.biSizeImage=絵bufferのsize; bmpInfo.bmiHeader.biXPelsPerMeter=0; bmpInfo.bmiHeader.biYPelsPerMeter=0; bmpInfo.bmiHeader.biClrUsed=0; bmpInfo.bmiHeader.biClrImportant=0; として int SetDIBitsToDevice( HDC hdc, int XDest,←0 int YDest,←0 DWORD dwWidth,←88 DWORD dwHeight,←31 int XSrc,←0 int YSrc,←0//決定点 UINT uStartScan,←0 UINT cScanLines,←31 CONST VOID *lpvBits,←絵bufferのpointer CONST BITMAPINFO *lpbmi,←&bmpInfo UINT fuColorUse←DIB_RGB_COLORS ); 一番気になるのは絵bufferにpngファイルから読みとったすべてのデータを入れたのですがそれでいいのかという点です。 チャンクを分析して一部だけをバッファに入れないといけないので有れば関数の価値は無くなりますからね。 絵データのみ入れるとパレット情報が抜けてしまうし・・・

関連するQ&A

  • 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);

  • SetDIBitsToDeviceでpngを

    描画する際に int SetDIBitsToDevice( HDC hdc, // デバイスコンテキストのハンドル int XDest, // 転送先長方形の左上隅の x 座標 int YDest, // 転送先長方形の左上隅の y 座標 DWORD dwWidth, // 転送元長方形の幅 DWORD dwHeight, // 転送元長方形の高さ int XSrc, // 転送元長方形の左下隅の x 座標 int YSrc, // 転送元長方形の左下隅の y 座標 UINT uStartScan, // 配列内の最初の走査行 UINT cScanLines, // 走査行の数 CONST VOID *lpvBits, // DIB ビットからなる配列 CONST BITMAPINFO *lpbmi, // ビットマップ情報 UINT fuColorUse // RGB 値またはパレットインデックス ); を指定しないといけないのですが png画像の縦幅と png画像の横幅と png画像のビットマップ情報が分からないとこの関数の引数を指定できません。 どのようにそれらの情報を知ればよいのでしょうか?

  • 基本的な質問です。

    SetDIBitsToDevice ( HDC hdc, int XDest, int YDest, DWORD dwWidth, DWORD dwHeight, int XSrc, int YSrc, UINT uStartScan, UINT cScanLines, CONST VOID *lpvBits, CONST BITMAPINFO *lpbmi, UINT fuColorUse=DIB_PAL_COLORS ) において lpvBitsには画像のデータ位置のポインタを指定し lpbmiには画像のBITMAPINFO値を指定するとして パレットはどこに指定するのでしょうか? lpbmiのサイズは40+4バイトであり パレットデータ用には1個(4バイト)しか用意されていません。 パレットデータが256個ある場合には他の255個入れる場所がありません。 これで絵が描けるのでしょうか?

  • visual c で、ビットマップを読み込む方法

    1120.bmpというファイルをvisual c++で読み込みたいのですが、初心者のため、いまいち方法が分かりません。 ネット上にビットマップの読み込みについて、 1 BITMAPFILEHEADERを読み込む(ビットマップで無い場合はじく) 2 BITMAPINFOHEADERを読み込む(16,256で無い場合ははじく) 3 BITMAPINFOHEADER構造体とRGBQUAD構造体の配列からなるBITMAPINFO構造体の領域を動的に確保する 4 CreateDIBSectionを使って、ビットマップビット列の領域を確保する 5 実際に描画する 6 プログラムが終了したときや、上書き読み込みをする場合は確保した領域を開放する と書いてあったのですが、3から先がたぶん分からない状態で、3のところまでも合っているか分かりません。 もしも、分かる方いらっっしゃったらお願い致します。 今、以下のところまでファイルの記述が終わっています。 #include <stdio.h> #include <stdlib.h> int main(void) { FILE *fp; int bfType; int bfSize; int bfReserved1; int bfReserved2; int bfOffBits; int biSize; int biWidth; int biHeight; int biPlanes; int biBitCount; int biCompression; int biSizeImage; int biXPelsPerMeter; int biYPelsPerMeter; int biClrUsed; int biClrImportant; int rgbBlue; int rgbGreen; int rgbRed; int rgbReserved; fp = fopen("1120.bmp", "rb"); if(fp == NULL) printf("ファイルオープンに失敗しました。\n"); //BITMAPFILEHEADER構造体 fread(&bfType, 14, 1, fp); fread(&bfSize, 4, 1, fp); fread(&bfReserved1, 2, 1, fp); fread(&bfReserved2, 2, 1, fp); fread(&bfOffBits, 4, 1, fp); //BITMAPINFOHEADER構造体 fread(&biSize, 4, 1, fp); fread(&biWidth, 4, 1, fp); fread(&biHeight, 4, 1, fp); fread(&biPlanes, 2, 1, fp); fread(&biBitCount, 2, 1, fp); fread(&biCompression, 4, 1, fp); fread(&biSizeImage, 4, 1, fp); fread(&biXPelsPerMeter, 4, 1, fp); fread(&biYPelsPerMeter, 4, 1, fp); fread(&biClrUsed, 4, 1, fp); fread(&biClrImportant, 4, 1, fp); fclose(fp); return 1; }

  • MFC - ダイアログボックスのPictureControlへの画像表示

    はじめまして。 現在MFCにおいて、ダイアログ形式のアプリケーションを作成しています。環境はVisual Studio 2005になります。 内容はWebカメラからのキャプチャを行い、そのキャプチャされた画像をダイアログ上に配置したPictureControlへ表示するというものです。 キャプチャされた画像は、1チャネルのグレースケールでありunsigned char型の1次元配列で格納されています。よってビットマップとして表示するには自身で構造体BITMAPINFOを作成しなければなりません。現状以下のように作成したのですが、うまく表示されません。 画像サイズは 320×240 です。 PictureControlのIDを IDC_BITMAP と設定し、 画素情報が格納されている配列を m_pbit とします。 int i; CWnd *pWnd = GetDlgItem( IDC_BITMAP ); CDC *Capt = pWnd->GetDC(); BITMAPINFO bmif; bmif.bmiHeader.biBitCount   =8; bmif.bmiHeader.biClrImportant =0; bmif.bmiHeader.biClrUsed    =256; bmif.bmiHeader.biCompression  =0; bmif.bmiHeader.biHeight     =240; bmif.bmiHeader.biPlanes     =1; bmif.bmiHeader.biSize      =sizeof(BITMAPINFOHEADER); bmif.bmiHeader.biSizeImage   =320*240; bmif.bmiHeader.biWidth     =320; bmif.bmiHeader.biXPelsPerMeter =0; bmif.bmiHeader.biYPelsPerMeter =0; for(i=0; i<256; i++){  bmif.bmiColors[i].rgbBlue = i;  bmif.bmiColors[i].rgbGreen = i;  bmif.bmiColors[i].rgbRed  = i;  bmif.bmiColors[i].rgbReserved = 0; } SetDIBitsToDevice(Capt->m_hDC, 0, 0, 320, 240, 0, 0, 0, 240, m_pbit, &bmif, DIB_RGB_COLORS); グレースケール画像なので配列bmiColorsは全て同色としました。 また、PictureControlのTypeをオーナ描画など全てのTypeを試しましたが、表示されませんでした。 必ずPictureControlに描画しなければならないという決まりはないのですが、ダイアログボックスにビットマップを表示するにはPictureControlだと考え、それに表示するようプログラムを組みました。 画素情報(グレースケールの輝度情報)のみ既知である状態からビットマップをダイアログに表示するためには他に方法があるのでしょうか? 上記のプログラムにおける間違い、またその他の方法についてアドバイスを頂けたらと思います。 よろしくお願いいたします。

  • StretchDIBits

    StretchDIBits()のxSrc, について質問なんですが この座標は, 画面の左下,左はしを(0,0) を基準としているんですか? 普通の関数の座標基準点とは上下逆になっているんですか? int StretchDIBits( HDC hdc, int XDest , int YDest , int nDestWidth , int nDestHeight , int XSrc , int YSrc , int nSrcWidth , int nSrcHeight , CONST VOID *lpBits, CONST BITMAPINFO *lpBitsInfo, UINT iUsage , DWORD dwRop );

  • 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; }

  • 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); ではうまくいきませんでした。

  • windowsのアプリケーションを作っているのですがどうにもうまくコン

    windowsのアプリケーションを作っているのですがどうにもうまくコンパイルできず困っています。 キャスト演算子かポインタ関係だと思うのですがいろいろ変えてみてもうまくいきませんでした。 私は朝までしかいられないため起きておられる方ですぐに答えられる方がいれば具体的にどうしたらできるようになるか答えていただけますでしょうか? 今日を逃したら大体、一ヶ月先に反応すると思うのでよろしくお願いします。 以下エラー部分です。 LRESULT CALLBACK WndProc(HWND hwnd,UINT iMsg,WPARAM wParam,LPARAM lParam) { HDC hdc,hdcWin; PAINTSTRUCT ps; int i,j; switch(iMsg){ case WM_CREATE: lpDIB=(LPBYTE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(BITMAPINFO)+E*F); lI=(LPBITMAPINFO)lpDIB; for(i=0;i<F;i++){ alpPixel[i]=(LPDWORD)(lpDIB+sizeof(BITMAPINFO)+E*i); } lI->bmiHeader.biSize =sizeof(BITMAPINFOHEADER); lI->bmiHeader.biWidth =B; lI->bmiHeader.biHeight =-B; lI->bmiHeader.biPlanes =1; lI->bmiHeader.biBitCount =B; lI->bmiHeader.biCompression =BI_RGB; for(i=0;i<D;i++){ *(alpPixel[0]+i)=0x00ff0000; *(alpPixel[1]+i)=0x0000ff00; *(alpPixel[2]+i)=0x000000ff; *(alpPixel[3]+i)=0x0000ffff; *(alpPixel[4]+i)=0x00ffffff; } hdc=GetDC(hwnd); hBMP=CreateCompatibleBitmap(hdcWin,C,C); hdcBMP=CreateCompatibleDC(hdc); hOldBMP=(HBITMAP)SelectObject(hdcBMP,hBMP); for(i=0;i<A;i++){ for(j=0;j<A;j++){ StretchDIBits(hdcBMP,j*B,i*B,B,B, 0,0,B,B,alpPixel[map[j+i*A]], lI,DIB_RGB_COLORS,SRCCOPY); } } ZeroMemory(&biInfo,sizeof(BITMAPINFO)); lI->bmiHeader.biSize =sizeof(BITMAPINFOHEADER); lI->bmiHeader.biWidth =C; lI->bmiHeader.biHeight =-C; lI->bmiHeader.biPlanes =1; lI->bmiHeader.biBitCount =B; lI->bmiHeader.biCompression =BI_RGB; ○ hBMP2=CreateDIBSection(hdc,&biInfo,DIB_RGB_COLORS,(LPVOID)(&lpPixel),NULL,0); //エラーはここ hdcBMP2=CreateCompatibleDC(hdc); hOldBMP2=(HBITMAP)SelectObject(hdcBMP2,hBMP2); ReleaseDC(hwnd,hdc); X=0; Y=1; return 0; case WM_DESTROY: ~中略~ } return DefWindowProc(hwnd,iMsg,wParam,lParam); }

  • windowsのアプリケーションを作っているのですがどうにもうまくコン

    windowsのアプリケーションを作っているのですがどうにもうまくコンパイルできず困っています。 一ヶ月前に同じ質問をしたのですが具体的にどうすればいいのかわからなかったのでもう一度質問させていただきます。 キャスト演算子かポインタ関係だと思うのですがいろいろ変えてみてもうまくいきませんでした。 具体的にどうしたらできるようになるか答えていただけますでしょうか? 私の都合により、一ヶ月先に反応すると思うのでよろしくお願いします。 以下エラー部分です。 LRESULT CALLBACK WndProc(HWND hwnd,UINT iMsg,WPARAM wParam,LPARAM lParam) { HDC hdc,hdcWin; PAINTSTRUCT ps; int i,j; switch(iMsg){ case WM_CREATE: lpDIB=(LPBYTE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(BITMAPINFO)+E*F); lI=(LPBITMAPINFO)lpDIB; for(i=0;i<F;i++){ alpPixel[i]=(LPDWORD)(lpDIB+sizeof(BITMAPINFO)+E*i); } lI->bmiHeader.biSize =sizeof(BITMAPINFOHEADER); lI->bmiHeader.biWidth =B; lI->bmiHeader.biHeight =-B; lI->bmiHeader.biPlanes =1; lI->bmiHeader.biBitCount =B; lI->bmiHeader.biCompression =BI_RGB; for(i=0;i<D;i++){ *(alpPixel[0]+i)=0x00ff0000; *(alpPixel[1]+i)=0x0000ff00; *(alpPixel[2]+i)=0x000000ff; *(alpPixel[3]+i)=0x0000ffff; *(alpPixel[4]+i)=0x00ffffff; } hdc=GetDC(hwnd); hBMP=CreateCompatibleBitmap(hdcWin,C,C); hdcBMP=CreateCompatibleDC(hdc); hOldBMP=(HBITMAP)SelectObject(hdcBMP,hBMP); for(i=0;i<A;i++){ for(j=0;j<A;j++){ StretchDIBits(hdcBMP,j*B,i*B,B,B, 0,0,B,B,alpPixel[map[j+i*A]], lI,DIB_RGB_COLORS,SRCCOPY); } } ZeroMemory(&biInfo,sizeof(BITMAPINFO)); lI->bmiHeader.biSize =sizeof(BITMAPINFOHEADER); lI->bmiHeader.biWidth =C; lI->bmiHeader.biHeight =-C; lI->bmiHeader.biPlanes =1; lI->bmiHeader.biBitCount =B; lI->bmiHeader.biCompression =BI_RGB; ○ hBMP2=CreateDIBSection(hdc,&biInfo,DIB_RGB_COLORS,(LPVOID)(&lpPixel),NULL,0); //エラーはここ hdcBMP2=CreateCompatibleDC(hdc); hOldBMP2=(HBITMAP)SelectObject(hdcBMP2,hBMP2); ReleaseDC(hwnd,hdc); X=0; Y=1; return 0; case WM_DESTROY: ~中略~ } return DefWindowProc(hwnd,iMsg,wParam,lParam); } エラー E2034 169: 'void *' 型は 'void * *' 型に変換できない(関数 __stdcall WndProc(HWND__ *,unsigned int,unsigned int,long) ) エラー E2340 169: 4 番目のパラメータは void * * 型として定義されているので void * 型は渡せない(関数 __stdcall WndProc(HWND__ *,unsigned int,unsigned int,long) ) エラーの部分はこんな感じでした。

専門家に質問してみよう