|
すいませんwindowsのプログラムです。
WIDTH_BYTE =
4 * ((bmpCoreHeader.bcWidth * mpCoreHeader.bcBitCount + 31)/ 32);
なぜ4を掛け 31を足し、32で割るのか教えてください
setPixelの部分で、iCountに1や2をなぜ足すのか教えてください。
iCount+=3の意味も教えてください
お願いします。
#include <windows.h>
BITMAPFILEHEADER bmpFileHeader;
BITMAPCOREHEADER bmpCoreHeader;
char * chPixelBit;
LRESULT CALLBACK WndProc(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp) {
HDC hdc;
PAINTSTRUCT ps;
int iCount = 0 , iXPos , iYPos;
const int WIDTH_BYTE =
4 * ((bmpCoreHeader.bcWidth * bmpCoreHeader.bcBitCount + 31)/ 32);
switch (msg) {
case WM_DESTROY:
free(chPixelBit);
PostQuitMessage(0);
return 0;
case WM_PAINT:
hdc = BeginPaint(hWnd , &ps);
for (iYPos = 0 ; iYPos < bmpCoreHeader.bcHeight ; iYPos++) {
for (iXPos = 0 ; ; iXPos++) {
if (iXPos > (bmpCoreHeader.bcWidth - 1)) {
iCount = (iYPos + 1) * WIDTH_BYTE;
break;
}
SetPixel(hdc , iXPos , iYPos , RGB(
chPixelBit[iCount + 2] ,
chPixelBit[iCount + 1] ,
chPixelBit[iCount]
));
iCount += 3;
}
}
EndPaint(hWnd , &ps);
return 0;
}
return DefWindowProc(hWnd , msg , wp , lp);
}
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
PSTR lpCmdLine , int nCmdShow) {
HWND hWnd;
MSG msg;
WNDCLASS winc;
HANDLE hFile;
DWORD dwBytes;
int iColorTableLength;
hFile = CreateFile(lpCmdLine , GENERIC_READ , 0 , NULL ,
OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL);
if (hFile == INVALID_HANDLE_VALUE) return 1;
ReadFile(hFile , &bmpFileHeader , sizeof(BITMAPFILEHEADER) , &dwBytes , NULL);
if (bmpFileHeader.bfType != 0x4D42) {
MessageBox(NULL , TEXT("This is not a bitmap file") , NULL , MB_OK);
return 1;
}
ReadFile(hFile , &bmpCoreHeader , sizeofBITMAPCOREHEADER) , &dwBytes , NULL);
chPixelBit = (char *) malloc (bmpFileHeader.bfSize -bmpFileHeader.bfOffBits);
ReadFile(hFile , chPixelBit ,
bmpFileHeader.bfSize - bmpFileHeader.bfOffBits , &dwBytes , NULL);
CloseHandle(hFile);
winc.style = CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc = WndProc;
winc.cbClsExtra = winc.cbWndExtra = 0;
winc.hInstance = hInstance;
winc.hIcon = LoadIcon(NULL , IDI_APPLICATION);
winc.hCursor = LoadCursor(NULL , IDC_ARROW);
winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
winc.lpszMenuName = NULL;
winc.lpszClassName = TEXT("KITTY");
if (!RegisterClass(&winc)) return 1;
hWnd = CreateWindow(
TEXT("KITTY") , lpCmdLine ,
WS_OVERLAPPEDWINDOW ^ WS_THICKFRAME | WS_VISIBLE ,
CW_USEDEFAULT , CW_USEDEFAULT ,
bmpCoreHeader.bcWidth ,
bmpCoreHeader.bcHeight + GetSystemMetrics(SM_CYCAPTION) ,
NULL , NULL , hInstance , NULL
);
if (hWnd == NULL) return 1;
while (GetMessage(&msg , NULL , 0 , 0 )) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
|