본문 바로가기

전체 글340

[Win32 API] WM_PAINT msg 처리 루틴에서 좌표 구하기 윈도에서 API로 그림을 그릴 때Invalidate..() 함수를 사용하여 그려질 좌표를 넘기고 WM_PAINT msg에서 이를 받아서 처리 하게 되는데 만약 여러개의 Invalidate..() 함수를 호출하면 WM_PAINT msg 처리 루틴에서 이번 호출이 어느 Invalidate..() 함수가 호출한 msg인지 어떻게 판단할까? BeginPaint() 함수의 두번째 인자인 PAINTSTRUCT가 여기에 대한 해답이 될듯하다. PAINTSTRUCT 구조체의 멤버를 보면 RECT 형이 있는데 이 놈이 Invalidate..() 함수 호출시 넘겨주었던 좌표라고 되어있다. 이 멤버를 가지고 WM_LBUTTONDOWN/WM_LBUTTONUP msg 처리 루틴에서 좌표를 읽듯 parsing을 하면 어떤 Inv.. 2008. 2. 6.
[Win32 API] WCS 과 MBS간의 변환 일반적인지는 모르겠지만 윈도 프로그래밍에서 유니코드 문자열은 wide charater (wcs) 라고 부르고 ascii 코드 문자열은 multi byte character (mbs) 라고 부르는 듯 하다. char * 형의 문자열을 출력 함수의 인자로 사용하니까 Data Abort 에러가 발생한다. 이걸 몰라서 하루동안 삽질을.. ㅠ.ㅠ 두 코드의 문자열을 서로 변환하기 위해서는 다음과 같은 함수를 사용하면 된다. size_t mbstowcs( wchar_t *wcstr, const char *mbstr, size_t count ); wcstr - The address of a sequence of wide characters mbstr - The address of a sequence of multib.. 2008. 2. 6.
[Win32 API] WM_PAINT msg 처리 API에 보면 자체적으로 WM_PAINT msg를 발생시키는 함수들이 존재한다 SetWindowPos(), MoveWinodw(), UpdateWindow() 등.. 그런데 WinProc CallBack 함수에서 WM_PAINT msg에 대한 처리를 하지 않으면 어떻게 될까? 특이하게도 무한 루프에 빠져 버린다. 아무 처리도 하지 않는 함수를 call 해봤다. 역시나 무한 루프에 빠져 버렸다. BeginPaint() / EndPaint() 를 넣어주니까 이상 없이 넘어가 버렸다 (물론 화면에 아무것도 그리는 것은 없지만..) 특이한 증상이다.. 한가지 더.. 화면을 그리기 위해서 과연 WM_PAINT를 발생 시켜야만 하는지.. WM_PAINT에서 처리하는 루틴을 함수로 만들어 이 함수를 각 msg 처리 .. 2008. 2. 6.
[Win32 API] WM_PAINT msg를 사용하지 않고.. LRESULT DrawBg( void *Data, HDC BGmemDC, HDC MemDC ) { HRESULT hr = S_OK; HBITMAP hOldBitmap = NULL; PImgInfo pImg = &pAgent->pImg[IMG_ANTENA]; PUserType pUserType = (PUserType) Data; hOldBitmap = (HBITMAP) SelectObject( MemDC, pImg->bmpImg[pImg->nCurrentImg] ); // TransparentImage( BGmemDC, pImg->Pos.x, pImg->Pos.y, pImg->info.bmWidth, pImg->info.bmHeight, // MemDC, 0, 0, pImg->info.bmWidth, pI.. 2008. 2. 6.