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;
}
...
}
|
вроде (не вдавался в тему) это надо, т.е. так надо рисовать правильно...
|
|
timson |
Отправлено: 01.09.2004, 19:43 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 82
|
Отредактировано 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() надо, когда рисование занимает много времени (массив данных большой, или, что не надо делать, расчеты есть) и окну посылаются повторные сообщения о перерисовки...
а вообще, когда процесс/поток нагружен, то сообщения с клавы, мыши не принемаются. а непосредственно в функци идет анализ состояния клавы, мыши (обычно в графике).
|
|
|