Вывод растрового изображения
Проблема, конечно, ламерская, но я только-что вылез из-под DOS'a.
P.S. Вот код:
#include <windows.h>
LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
HINSTANCE hInst;
LPCSTR AppName="--DEM0_W!ND0W--";
HBITMAP hBit1;
HDC DC, memDC;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpszArgs, int nWinMode)
{
HWND hWnd;
MSG msg;
hInst=hInstance;
WNDCLASS wc;
ZeroMemory(&wc,sizeof(wc));
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.hInstance = hInst;
wc.hIcon = LoadIcon(hInst, IDI_APPLICATION);
wc.hCursor = LoadCursor(hInst, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszClassName = AppName;
if(!RegisterClass(&wc)){
MessageBox( NULL, "Error Register Class", "Error", MB_OK | MB_ICONERROR );
return 0;
}
hWnd = CreateWindow(
AppName,
AppName,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
300, 300,
HWND_DESKTOP,
NULL,
hInst,
NULL);
hBit1=LoadBitmap(hInst,"Offspring");
ShowWindow(hWnd, nWinMode);
UpdateWindow(hWnd);
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_LBUTTONDOWN: {
ShowMessage("TaDaMMM!!!");
DC=GetDC(hWnd);
memDC=CreateCompatibleDC(DC);
SelectObject(memDC,hBit1);
BitBlt(DC,LOWORD(lParam),HIWORD(lParam),90,90,memDC,0,0,SRCPAINT);
ReleaseDC(hWnd,DC);
DeleteDC(memDC);
break;
}
case WM_RBUTTONDOWN: {
DC=GetDC(hWnd);
memDC=CreateCompatibleDC(DC);
SelectObject(memDC,hBit1);
BitBlt(DC,LOWORD(lParam),HIWORD(lParam),90,90,memDC,0,0,SRCPAINT);
ReleaseDC(hWnd,DC);
DeleteDC(memDC);
break;
}
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, msg, wParam, lParam);
}
return 0;
}
Сплошной WinAPI ... почему бы не воспользоваться компонентами TImage, TPaintBox ... раз уж в форуме про билдер тема обсуждается.
Я бы рад, но препод "приказал" юзать только WinAPI;(
hBit1=LoadBitmap(hInst,"Offspring");
2. В BitBlt я думаю лучше использовать не SRCPAINT, а SRCCOPY.
3. Прежде чем удалять memDC нужно в нем восстановить старый объект bitmap. Делается это так:
HBITMAP hOldBitmap = SelectObject(memDC, hBit1);
...
SelectObject(memDC, hOldBitmap);
DeleteDC(memDC);
4. Нужно не забыть обработать сообщение WM_PAINT. Иначе картинка будет портится, если окно программы перекрыть другими окнами.
Может поможет...
Ещё вопрос -- как проверить нажата ли клавиша CTRL при нажатии кнопки мыши? Вроде бы так:
...
case WM_RBUTTONDOWN: {
if(wParam==MK_CONTROL){...;}
...
Но не работает:((
Цитата:
Originally posted by gmJay
Спасибо!! Теперь всё работает.
Ещё вопрос -- как проверить нажата ли клавиша CTRL при нажатии кнопки мыши? Вроде бы так:
...
case WM_RBUTTONDOWN: {
if(wParam==MK_CONTROL){...;}
...
Но не работает:((
Спасибо!! Теперь всё работает.
Ещё вопрос -- как проверить нажата ли клавиша CTRL при нажатии кнопки мыши? Вроде бы так:
...
case WM_RBUTTONDOWN: {
if(wParam==MK_CONTROL){...;}
...
Но не работает:((
Если не обязательно всё на API, то так:
GetKeyState(VK_CONTROL);
true если нажата, false если не нажата.
ЗЫ На%%й преподу API?
case WM_RBUTTONDOWN: {
DWORD paint_mode=SRCPAINT;
if(wParam==(MK_CONTROL|MK_RBUTTON))paint_mode=SRCINVERT;
З.Ы. A кто их преподов поймёт... Х.З. зачем ему API. Он нас заставлял ещё и окна самим создавать, а когда я ему сообщил, что их можно и "мышью нарисовать", то он сурово так посмотрел -- пришлось делать всё руками, да и знание WinAPI всё же не помешает.
Цитата:
Originally posted by gmJay
Он нас заставлял ещё и окна самим создавать
Он нас заставлял ещё и окна самим создавать
Не пойму что-то. Первый раз встречаю упоминание о преподе, который учит и заставляет учиться, а вы еще чем-то недовольны. На программеров учитесь ведь?
Мышкой каждый дурак может. А WinAPI знать действительно не помешает, пока Винда жива.
Я же написал, что "знание WinAPI всё же не помешает"(© gmJay), да и ASM'у я уважаю, просто Absolut и BeSkin задали вопрос о целесообразности использования API при наличии более удобных средств, но это уже тема другого форума.