C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
API, Даже две
ars
Отправлено: 31.08.2004, 03:52


Не зарегистрирован







У меня возникла проблема — не могу выстовить через API jpg файлы на рабочий чтол, а с bmp файлами работает. Использовал SystemParametersInfo.
Может кто-нибудь знает решение этой делемы?

Второе — создал окно, полностью на API, в центре окна нарисовал кружок. Свернешь, развернешь — кружок пропадает, прикроешь другим приложением — тоже пропадает. Вообщем, хочу сделать окно как в компоненте AvtoRadrew = true. Многие оконные стили, свойства перебрал, но ... .
Кто-нибудь знает как это исправить?

Dima
Отправлено: 31.08.2004, 05:40


Дежурный стрелочник

Группа: Участник
Сообщений: 61



попробуй почитать книги. Например Ч. Петзолд "Программирование для Windows 95"
timson
Отправлено: 31.08.2004, 07:48


Станционный диспетчер

Группа: Участник
Сообщений: 82



QUOTE
Свернешь, развернешь — кружок пропадает, прикроешь другим приложением — тоже пропадает.

WM_PAINT смотри...
Konstantine
Отправлено: 31.08.2004, 08:10


Мастер участка

Группа: Модератор
Сообщений: 545



По событию OnPaint перерисовуй вручную
ars
Отправлено: 31.08.2004, 13:36


Не зарегистрирован







Я думаю, что по OnPaint бессмысленно. Тогда уж по OnCenge лучше. Не, — это не выход!
Насколько я знаю, WM_PAINT наступает во время рисования. Какой смысл спрашивается? Думаю всетаки нужен какой то стиль WNDCLASSEX? Как например HREDRAW, VREDRAW.
А насчет выстовления jpg файлов на рабочий стол, кто-нибудь знает? Я делал так:
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "C:\\pic.jpg",
SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
Но ... не работает, даже не ругается. В чем дело не пойму?
joynter
Отправлено: 31.08.2004, 15:55


Станционный диспетчер

Группа: Участник
Сообщений: 137



исходник бы посмотреть
ars
Отправлено: 31.08.2004, 16:31


Не зарегистрирован







Смротри. Исходник:
#include
LRESULT CALLBACK WndProc(HWND hwnd, UINT messg, WPARAM wParam,LPARAM lParam);
char message[] = "This is my first API-windows programm!";

WNDCLASSEX wc;
HWND hwnd;

WINAPI WinMain(HINSTANCE hInst,
HINSTANCE hPreInst,
LPSTR lpszcmdLine,
int cmdShow){
wc.cbSize = sizeof(WNDCLASSEX);
wc.lpszClassName = "CLASS1";
wc.hInstance = hInst;
wc.lpfnWndProc = WndProc;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wc.lpszMenuName = NULL;//ìåíþ
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wc.style = S_HREDRAW|CS_VREDRAW|CS_SAVEBITS;//|CS_NOCLOSE;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
if(!RegisterClassEx(&wc)){
return false;
}
hwnd = CreateWindowEx(
WS_EX_APPWINDOW,
"CLASS1",
"Просто окно",
WS_OVERLAPPEDWINDOW|WS_VISIBLE,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
(HWND) NULL,
(HMENU)NULL,
(HINSTANCE)hInst,
(LPSTR)NULL
);
ShowWindow(hwnd, cmdShow);
UpdateWindow(hwnd);
MSG msg;
while(GetMessage(&msg,NULL,0,0)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT messg, WPARAM wParam,LPARAM lParam){
switch(messg){
case WM_CREATE:
HRGN hrgn;
MessageBox(NULL,"Creating","WndProc",MB_OK);
SetWindowRgn(hwnd,hrgn,NULL);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_KEYDOWN:
HDC hdc;
hdc = GetDC(hwnd);
Ellipse(hdc,50,50,200,200);
ReleaseDC(hwnd,hdc);
break;

default:
return(DefWindowProc(hwnd,messg,wParam,lParam));
}
}


joynter
Отправлено: 01.09.2004, 09:33


Станционный диспетчер

Группа: Участник
Сообщений: 137



а если задействовать WM_ACTIVATE и WM_MOVE ?
что-то типа:

switch(messg)
{
case WM_CREATE:
HRGN hrgn;
MessageBox(NULL,"Creating","WndProc",MB_OK);
SetWindowRgn(hwnd,hrgn,NULL);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_KEYDOWN :
anchor: HDC hdc;
hdc = GetDC(hwnd);
Ellipse(hdc,50,50,200,200);
ReleaseDC(hwnd,hdc);
break;

case WM_ACTIVATE :
goto anchor;
case WM_MOVE :
goto anchor;
default:
return(DefWindowProc(hwnd,messg,wParam,lParam));
}

а про рабочий стол можно исходник?

Отредактировано joynter — 01/09/2004, 10:37
Shura
Отправлено: 01.09.2004, 12:59


Дежурный стрелочник

Группа: Участник
Сообщений: 45



насколько я помню, на рабочий стол нельзя положить jpg. При ручном выборе обоев, когда выбираешь jpg он предлагает ActiveDesktop включить.

Насчет перерисовки — обрабатывай сообщение WM_PAINT
** avtoritet
Отправлено: 01.09.2004, 14:49


Не зарегистрирован







Мозга не еб... ! Шура прав на все 100%! Код рисования пиши в событии WM_PAINT. И хватит выдумывать с метками.
joynter
Отправлено: 01.09.2004, 15:02


Станционный диспетчер

Группа: Участник
Сообщений: 137



QUOTE (** avtoritet @ 01/09/2004, 15:51)
Мозга не еб... ! Шура прав на все 100%! Код рисования пиши в событии WM_PAINT. И хватит выдумывать с метками.

событие WM_PAINT наступает перед прорисовкой — будем по кругу бегать?
а метки — ет от лени — не нравятся — пиши функцию my_paint() и вставляй ее в те же WM_ACTIVATE WM_MOVE и тд


Отредактировано joynter — 01/09/2004, 16:12
** avtoritet
Отправлено: 01.09.2004, 15:33


Не зарегистрирован







Да вот ты не веришь! Попробуй все ништяк будет. Пойми, когда окно накрыто, а потом активно — оно прорисовывается. Просто ты пишешь лишний код, лишние такты компа. Есть специальное событие — и оно — WM_PAINT. Туда можно сказать входят и WM_MOVE, WM_ACTIVE.
Во так:
switch(messg){
case WM_CREATE:
HRGN hrgn;
MessageBox(NULL,"Creating","WndProc",MB_OK);
SetWindowRgn(hwnd,hrgn,NULL);

break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_PAINT:
HDC hdc;
hdc = GetDC(hwnd);
Ellipse(hdc,50,50,200,200);
ReleaseDC(hwnd,hdc);
default:
return(DefWindowProc(hwnd,messg,wParam,lParam));
}
joynter
Отправлено: 01.09.2004, 16:10


Станционный диспетчер

Группа: Участник
Сообщений: 137



QUOTE (** avtoritet @ 01/09/2004, 16:35)
Да вот ты не веришь! Попробуй все ништяк будет.

это первое ,что я попробывал — происходит следующее:
1.вызываем Ellipse(hdc,50,50,200,200);
2.перед прорисовкой приходит сообщение WM_PAINT
3.по этому сообщению снова вызываем Ellipse(hdc,50,50,200,200);
и так до бесконечности.
(ежели ты мне не веришь, то посмотри загрузку проца во время выполнения)


** avtoritet
Отправлено: 01.09.2004, 16:26


Не зарегистрирован







нЕ ПОНЯЛ ЧТО УТЕБЯ НЕ ТАК? У меня все отлично. У тебя что, не прорисовывается то что надо под WM_PAINT.
joynter
Отправлено: 01.09.2004, 16:36


Станционный диспетчер

Группа: Участник
Сообщений: 137



прорисовывается!!!
причем постоянно!!!
НЕ ОСТАНАВЛИВАЯСЬ!!!
а хотелось бы чтоб один раз прорисовалось и остановилось на этом
** avtoritet
Отправлено: 01.09.2004, 16:58


Не зарегистрирован







Ладно хватит! У меня что так, что так — еффект один! Постоянно! Странно! У меня только при:
1) Перетаскивание
2) Изменение размеров
3) Смене позиции(развернуть, сернуть..)
4) Фокусе
Все!
timson
Отправлено: 01.09.2004, 19:42


Станционный диспетчер

Группа: Участник
Сообщений: 82



кароче, такая фигня в API, про зацикливание WM_PAINT, надо системе то сказать, что мы рисуем и нам не надо пока еще это сообщение присылать

CODE
HDC BeginPaint(
 HWND hwnd,            // handle to window
 LPPAINTSTRUCT lpPaint // paint information
);

BOOL EndPaint(
 HWND hWnd,                  // handle to window
 CONST PAINTSTRUCT *lpPaint  // paint data
);


вот че получается (сокр.):
CODE
switch(msg)
{
...
case WM_PINT:
 {
  PAINTSTRUCT ps;
  HDC hDC = BeginPaint(hWnd, &ps);
 
  DrawObject(hDC);

  EndPaint(hWnd, &ps);
 
  break;
 }
...
}


вроде (не вдавался в тему) это надо, т.е. так надо рисовать правильно... smile.gif
timson
Отправлено: 01.09.2004, 19:43


Станционный диспетчер

Группа: Участник
Сообщений: 82



smile.gif

Отредактировано timson — 01/09/2004, 20:46
joynter
Отправлено: 02.09.2004, 10:43


Станционный диспетчер

Группа: Участник
Сообщений: 137



2timson: вопрос чайника:
а что, укаждого event'a есть BeginEvent и EndEvent или их ограниченное количество?
timson
Отправлено: 02.09.2004, 18:05


Станционный диспетчер

Группа: Участник
Сообщений: 82



как заработало??

QUOTE
а что, укаждого event'a есть BeginEvent и EndEvent или их ограниченное количество?

нет, зачем, например, на WM_MOUSEMOVE такое..
насчет ограниченного количества — может быть, незнаю, нада смотреть.. но кажется что должны быть....

скорее всего BeginPaint() — EndPaint() надо, когда рисование занимает много времени (массив данных большой, или, что не надо делать, расчеты есть) и окну посылаются повторные сообщения о перерисовки...

а вообще, когда процесс/поток нагружен, то сообщения с клавы, мыши не принемаются. а непосредственно в функци идет анализ состояния клавы, мыши (обычно в графике).

Вернуться в Вопросы программирования в C++Builder