|
回答どうもありがとうございます。
実際コンパイルしていただければ解るとおもいますが
(変数の宣言のところstaticが足りなかったのでそこだけ書き加えました)
480x480の背景に,32x16の長方形 4x96の長方形をかいてます。
しかし,4x96が4x32の長方形に表示されます
プログラムの簡単説明。
1 最初2個のfor文で, 32x16の長方形の, 色をアドレスに代入
2 次の2個のfor文で, 4x96の長方形の, 色をアドレスに代入
狙いとしては4x96の長方形を表示したい。
しかし実際4x32の長方形が表示されます。
ちゃんとfor文で96回色を代入してると思うんですが
なぜ4x32の長方形が表示されるんでしょうか?
よろしければアドバイスをお願いします。
#include<windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { BITMAPINFO biSCInfo;
static HDC hdc, hdcSC;
PAINTSTRUCT ps;
static HBITMAP hOld;
static HBITMAP hSCBMP;
LPDWORD lpPixelBuf,lpSCPixel;
LPDWORD alpChrPixel, lpBGPixel, ooo;
int i, j, r, g, b;
switch (iMsg) {
case WM_CREATE:
/* バッファ確保 */
lpPixelBuf = (LPDWORD)HeapAlloc(GetProcessHeap(),
HEAP_ZERO_MEMORY, (32 * 32 + 32 * 96 + 480 * 480) * 4);
/* ピクセル列の先頭アドレス設定 */
alpChrPixel = lpPixelBuf ;
ooo = lpPixelBuf + 1024;
/* 背景ピクセル列アドレス設定 */
lpBGPixel = lpPixelBuf + (1024 + 32 * 96);
for (i = 0;i < 32;i++) {
for (j = 16;j < 32;j++) {
r = 96 - i;
g = 128 + i * 2;
b = 64;
*(alpChrPixel + (i + j * 32)) = (r << 16) + (g << 8) + b;
}
}
for (i = 0;i < 96;i++) {
for (j = 14;j < 18;j++) {
*( ooo + (j + i * 96)) = 0x004080ff;
}
}
srand((unsigned)time(NULL));
/* 背景画像初期化 */
for (i = 0;i < 480 * 480;i++) {
r = rand() % 64 + 32;
g = rand() % 32;
b = rand() % 64 + 64;
lpBGPixel[i] = (r << 16) + (g << 8) + b;
}
/* DIBSection用BITMAPINFOをゼロクリア */
ZeroMemory(&biSCInfo, sizeof(BITMAPINFO));
/* DIBSection用BITMAPINFO設定 */
biSCInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
biSCInfo.bmiHeader.biWidth = 480;
biSCInfo.bmiHeader.biHeight = -480;
biSCInfo.bmiHeader.biPlanes = 1;
biSCInfo.bmiHeader.biBitCount = 32;
biSCInfo.bmiHeader.biCompression = BI_RGB;
/* ウインドウのデバイスコンテキスト取得 */
hdc = GetDC(hwnd);
/* biSCinfoからバックバッファ用DIBSectionを作成 */
hSCBMP = CreateDIBSection(hdc, &biSCInfo, DIB_RGB_COLORS,
(LPVOID)(&lpSCPixel), NULL, 0);
/* DIBSection用のメモリDCを作成 */
hdcSC = CreateCompatibleDC(hdc);
/* メモリDCにDIBSectionを選択 */
hOld = SelectObject(hdcSC, hSCBMP);
/* 不要になったウインドウのDCを解放 */
ReleaseDC(hwnd, hdc);
CopyMemory(lpSCPixel, lpBGPixel, 480 * 480 * 4);
for (i = 0;i < 32;i++) {
for (j = 0;j < 32;j++) {
if (*(alpChrPixel + (j + i * 32)) != 0) {
lpSCPixel[240 + j + (i + 440) * 480] =
*(alpChrPixel + (j + i * 32));
}
}
}
for (i = 0;i < 96;i++) {
for (j = 0;j < 32;j++) {
if (*(ooo + (j + i * 96)) != 0) {
lpSCPixel[240 + j + (i + 200) * 480] =
*(ooo + (j + i * 96));
}
}
}
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
/* バックバッファを表示 */
BitBlt(hdc, 0, 0, 480, 480, hdcSC, 0, 0, SRCCOPY);
EndPaint(hwnd, &ps);
return 0;
}
return DefWindowProc(hwnd, iMsg, wParam, lParam);
}
|