http://www13.plala.or.jp/kymats/study/MULTIMEDIA/create_dibsection.html
にあるC言語で書かれたものをRustで表したく以下のようなコードを組んでみたのですがうまくいきません。(ウィンドウの作成などは省略しています。)
また、コンパイルは普通に成功します。
該当のソースコード
Rust
1unsafe extern "system" fn win_proc( 2 hwnd: HWND, 3 msg: UINT, 4 w_param: WPARAM, 5 l_param: LPARAM, 6) -> LRESULT { 7 match msg { 8 WM_DESTROY => { 9 PostQuitMessage(0); 10 } 11 WM_PAINT => { 12 let hdc = GetDC(hwnd); 13 let bmi: BITMAPINFO = BITMAPINFO { 14 bmiColors: [RGBQUAD { 15 rgbBlue: 0, 16 rgbRed: 0, 17 rgbGreen: 0, 18 rgbReserved: 0, 19 }], 20 bmiHeader: BITMAPINFOHEADER { 21 biBitCount: 32, 22 biClrImportant: 0, 23 biClrUsed: 0, 24 biCompression: 0, 25 biPlanes: 1, 26 biSize: mem::size_of::<BITMAPINFO>() as u32, 27 biSizeImage: 0, 28 biWidth: 200, 29 biHeight: 200, 30 biXPelsPerMeter: 0, 31 biYPelsPerMeter: 0, 32 }, 33 }; 34 let mut lpPixel: LPDWORD = ptr::null_mut(); 35 let hBitmap = CreateDIBSection( 36 hdc, 37 &bmi, 38 DIB_RGB_COLORS, 39 lpPixel as *mut *mut VOID, 40 ptr::null_mut(), 41 0, 42 ); 43 let hMemDC = CreateCompatibleDC(hdc); 44 SelectObject(hMemDC, hBitmap as *mut VOID); 45 46 for y in 10..40 { 47 for x in 10..40 { 48 *(lpPixel.offset(x + y * 200)) = 0x00ff0000; 49 } 50 } 51 Rectangle(hMemDC, 10, 10, 40, 40); 52 53 StretchDIBits( 54 hdc, 55 0, 56 0, 57 200, 58 200, 59 0, 60 0, 61 200, 62 200, 63 lpPixel as *mut VOID, 64 &bmi, 65 DIB_RGB_COLORS, 66 SRCCOPY, 67 ); 68 BitBlt(hdc, 0, 0, 200, 200, hMemDC, 0, 0, SRCCOPY); 69 70 ReleaseDC(hwnd, hdc); 71 DeleteDC(hMemDC); 72 DeleteObject(hBitmap as *mut VOID); 73 } 74 _ => return DefWindowProcW(hwnd, msg, w_param, l_param), 75 }; 76 0 77}
このまま実行すると、
error: process didn't exit successfully: target\debug\DIBTest.exe (exit code: 0xc000041d)
と出て、プログラムが強制終了してしまいます。
また、色々試した結果、*(lpPixel.offset(x + y * 200)) = 0x00ff0000
の行をコメントアウトすれば動くことは確認できました。
どなたか解決方法をご存じないでしょうか。
補足情報
winapi 0.3.9を使用しています
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/06/28 07:45