Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вывод растрового изображения

9.5K
22 мая 2005 года
gmJay
11 / / 22.05.2005
Не получается вывести битмап по клику мыши:(
Проблема, конечно, ламерская, но я только-что вылез из-под 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;
}
376
23 мая 2005 года
Absolut
220 / / 22.11.2002
Сплошной WinAPI ... почему бы не воспользоваться компонентами TImage, TPaintBox ... раз уж в форуме про билдер тема обсуждается.
9.5K
23 мая 2005 года
gmJay
11 / / 22.05.2005
Я бы рад, но препод "приказал" юзать только WinAPI;(
831
24 мая 2005 года
S_T
117 / / 23.10.2002
1. У Вас точно в ресурсном файле для программы есть запись о BITMAP с иднетификатором "Offspring"? Проверте, в дебаггере, что возвращает строка
hBit1=LoadBitmap(hInst,"Offspring");
2. В BitBlt я думаю лучше использовать не SRCPAINT, а SRCCOPY.
3. Прежде чем удалять memDC нужно в нем восстановить старый объект bitmap. Делается это так:
HBITMAP hOldBitmap = SelectObject(memDC, hBit1);
...
SelectObject(memDC, hOldBitmap);
DeleteDC(memDC);
4. Нужно не забыть обработать сообщение WM_PAINT. Иначе картинка будет портится, если окно программы перекрыть другими окнами.

Может поможет...
9.5K
24 мая 2005 года
gmJay
11 / / 22.05.2005
Спасибо!! Теперь всё работает.
Ещё вопрос -- как проверить нажата ли клавиша CTRL при нажатии кнопки мыши? Вроде бы так:
...
case WM_RBUTTONDOWN: {
if(wParam==MK_CONTROL){...;}
...
Но не работает:((
10K
26 мая 2005 года
BeSkin
7 / / 26.05.2005
Цитата:
Originally posted by gmJay
Спасибо!! Теперь всё работает.
Ещё вопрос -- как проверить нажата ли клавиша CTRL при нажатии кнопки мыши? Вроде бы так:
...
case WM_RBUTTONDOWN: {
if(wParam==MK_CONTROL){...;}
...
Но не работает:((


Если не обязательно всё на API, то так:
GetKeyState(VK_CONTROL);
true если нажата, false если не нажата.
ЗЫ На%%й преподу API?

9.5K
26 мая 2005 года
gmJay
11 / / 22.05.2005
A-a-a! Блин, я же забыл, что кнопка мыши тоже нажата. В общем, исправил, работает:

case WM_RBUTTONDOWN: {
DWORD paint_mode=SRCPAINT;
if(wParam==(MK_CONTROL|MK_RBUTTON))paint_mode=SRCINVERT;

З.Ы. A кто их преподов поймёт... Х.З. зачем ему API. Он нас заставлял ещё и окна самим создавать, а когда я ему сообщил, что их можно и "мышью нарисовать", то он сурово так посмотрел -- пришлось делать всё руками, да и знание WinAPI всё же не помешает.
10
26 мая 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by gmJay
Он нас заставлял ещё и окна самим создавать


Не пойму что-то. Первый раз встречаю упоминание о преподе, который учит и заставляет учиться, а вы еще чем-то недовольны. На программеров учитесь ведь?

Мышкой каждый дурак может. А WinAPI знать действительно не помешает, пока Винда жива.

9.5K
27 мая 2005 года
gmJay
11 / / 22.05.2005
Тема плавно(или не очень) перетекает в обсуждение о роли WinAPI в жизни кодеров :-)
Я же написал, что "знание WinAPI всё же не помешает"(© gmJay), да и ASM'у я уважаю, просто Absolut и BeSkin задали вопрос о целесообразности использования API при наличии более удобных средств, но это уже тема другого форума.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог