Я пытаюсь установить пиксель щелчком мыши, но при нажатии ничего не происходит.Вот часть моего кода.
Во-первых, я контролирую изменение размера окна в WM_SIZE.Затем в первый раз, когда я хочу установить пиксель мышью, я получаю ширину и высоту окна, затем копирую содержимое окна в память HDC и HBITMAP (в окне Store) (размер HBITMAP равен (width, height)).На самом деле я копирую в память только чистое окно.
И чем в любом случае я устанавливаю пиксель в память постоянного тока.В следующей обработке сообщений WM_PAINT я рисую память DC на экран.
.....
case WM_SIZE:
{
CheckWidthHeight();
break;
}
case WM_MBUTTONDOWN:
{
if (firstTimeDraw)
{
CheckWidthHeight();
StoreWindow();
firstTimeDraw = false;
}
SetPixel(memoryDC, LOWORD(lParam), HIWORD(lParam), RGB(0,0,0));
break;
}
case WM_PAINT:
{
RestoreWindow();
break;
}
.....
, где мои функции и переменные:
HDC memoryDC;
HBITMAP memoryBitmap;
int width = 0, height = 0;
bool firstTimeDraw = true;
void CheckWidthHeight()
{
RECT clientRect;
GetClientRect(hwnd, &clientRect);
width = clientRect.right - clientRect.left;
height = clientRect.bottom - clientRect.top;
}
//Copy real window content to memory window
void StoreWindow()
{
HDC hDC = GetDC(hwnd);
memoryDC = CreateCompatibleDC(hDC);
memoryBitmap = CreateCompatibleBitmap(hDC, width, height);
SelectObject(memoryDC, memoryBitmap);
BitBlt(memoryDC, 0, 0, width, height, hDC, 0, 0, SRCCOPY);
ReleaseDC(hwnd, hDC);
}
//Copy memory windows content to real window at the screen
void RestoreWindow()
{
PAINTSTRUCT ps;
HDC hDC = BeginPaint(hwnd, &ps);
memoryDC = CreateCompatibleDC(hDC);
SelectObject(memoryDC, memoryBitmap);
BitBlt(hDC, 0, 0, width, height, memoryDC, 0, 0, SRCCOPY);
EndPaint(hwnd, &ps);
}
Что я делаю неправильно?
UPD:
Выстрел в темноте: вы обрабатываете нажатие средней кнопки.Вы случайно нажали левую или правую кнопку мыши?:)
Хорошо.Теперь я использую WM_LBUTTONUP или WM_LBUTTONDOWN.Больше ничего не происходит.
UPD2:
- Когда вы изменяете DC памяти, вы также захотите сделать недействительной часть окна, на которую влияют, так что Windows будетсоздать для него сообщение WM_PAINT.InvalidateRect будет хорошим местом для начала.
Я поместил этот код
RECT rect;
GetClientRect(hwnd, &rect);
InvalidateRect(hwnd, &rect, true);
перед EndPaint.Ничего такого.Чем я перемещаю его после EndPaint.Ничего.
- В обработчике WM_PAINT вам нужно использовать DC, предоставляемый BeginPaint, и вызывать EndPaint, когда вы закончите с ним.
Я делаю это в RestoreWindow ().
Я пока не знаю, в чем проблема ...
UPD3:
Должно произойти InvalidateRect ()в обработчике WM_? BUTTONDOWN после SetPixel (не в RestoreWindow ()) - это то, что сообщает Windows, что вы хотите получить WM_PAINT в первую очередь.
Ok.Я сделал это до того, как ты написал это сообщение.Все еще не работает.
UPD4:
Большое спасибо, Реми!Спасибо всем остальным.Теперь все в порядке !!