Форум: "WinAPI";
Текущий архив: 2003.08.04;
Скачать: [xml.tar.bz2];
ВнизОкно копирует фон в WinXP. Найти похожие ветки
← →
Mr. API (2003-05-26 21:28) [0]Привет, всем.
Имеется следующая проблема. При запуске программы в WinXP фон формы не серый, а то что было раньше на рабочем столе, т. е. форма скопировала на себя задний план. Но если ту же программу запустить по Win98, то все работает.
В чем ошибка?
Ниже привожу пример программы, где возникает такой глюк.
program winmin;
uses
windows, messages;
var
WC : TWndClassEx;
MainWnd : HWND;
Msg : TMsg;
hBtn : HWND;
function WindowProc(Wnd: THandle; Msg: Integer;
wParam : Word;
lParam: Longint): Integer; stdcall; export;
begin
WindowProc := 0;
case Msg of
WM_COMMAND :
begin
case loWord(wParam) of
100 : SendMessage(Wnd, WM_CLOSE, 0, 0);
end;
end;
WM_DESTROY :
begin
PostQuitMessage(0);
exit;
end;
end;
WindowProc := DefWindowProc(Wnd, Msg, WParam, LParam);
end;
begin
WC.cbSize := SizeOf(WC);
WC.style := CS_HREDRAW or CS_VREDRAW;
WC.lpfnWndProc := @WindowProc;
WC.cbClsExtra := 0;
WC.cbWndExtra := 0;
WC.hInstance := hInstance;
WC.hIcon := LoadIcon(0, IDI_APPLICATION);
WC.hCursor := LoadCursor(0, IDC_ARROW);
WC.hbrBackground := GetStockObject(LTGRAY_BRUSH);
WC.lpszMenuName := "";
WC.lpszClassName := "TestWndClass";
if RegisterClassEx(WC) = 0 then
Halt(255);
MainWnd := CreateWindowEx(0,"TestWndClass",
"Caption",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
300, 200, 0, 0,
hInstance, NIL);
hBtn := CreateWindowEx(0, "BUTTON",
"OK", BS_DEFPUSHBUTTON or WS_CHILD or WS_VISIBLE,
110, 125,
75, 25,
MainWnd,
100,
hInstance, NIL);
ShowWindow(MainWnd, CmdShow);
While GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end.
Всем Спасибо.
← →
Bloody (2003-05-27 13:12) [1]я не стал компилировать этот пример (у меня C++ Builder), но насколько я помню классичские примеры после ShowWindow надо выполнить
UpdateWindow(MainWnd);
это команда вызовет обработку сообщения WM_PAINT, что должно заставить программу нормально отрисовать окно.
← →
Diamond Cat (2003-05-27 13:43) [2]Если уж списываешь откуда-то пример то посторайся по крайней мере списать без ошибок.
ты объявляешь
> var
> WC : TWndClassEx;
далее заполняешь WC
← →
Diamond Cat (2003-05-27 13:49) [3]блин не то нажал продолджаем
> WC.lpszClassName := "TestWndClass";
и после этого
> MainWnd := CreateWindowEx(0," TestWndClass",
подумай что ты сделал????
надо MainWnd := CreateWindowEx(0," wc.lpszClassName",...
далее не плохо былобы придать твоемуокну "стили" хотябы ws_ex_toolwindow тобишь
MainWnd := CreateWindowEx(ws_ex_toolwindow," wc.lpszClassName",...
и последнее если я не ошибаюсь, то для того чтоб на окне могли разместится контролы ему нужно определить себя как CS_PARENTDC
т.е.
WC.style := CS_HREDRAW or CS_VREDRAW or CS_PARENTDC;
вроде все , Удачи
← →
DVM (2003-05-27 19:10) [4]
> function WindowProc(Wnd: THandle; Msg: Integer;
> wParam : Word;
> lParam: Longint): Integer; stdcall; export;
здесь это уже справшивали, где вы этот код берете то?
Остальное все нормально.
← →
Nick Denry (2003-05-27 19:49) [5]Скачай русскую справку по АПИ. С правильными примерами.
http://www.soobcha.ru/rushelpъ
там есть ответ на твой вопрос.
← →
Mr. API (2003-05-27 22:34) [6]2 DVM
В и-нете где-то нашел.
А что неправильно в описании функции?
2 Diamond Cat
>подумай что ты сделал????
>надо MainWnd := CreateWindowEx(0,"wc.lpszClassName",...
А вот это имхо бред.
2 All
Все ваши рассуждения давольно интересны. Но повторюсь в Win98 все работает прекрасно. Скорее всего что-то действительно со стилями.
← →
DVM (2003-05-28 11:22) [7]Найдите несколько отличий:
program winmin;
uses windows, messages;
{!Модули windows и messages самые необходимые — они обязательно должны быть
объявлены в начале каждой Вашей программы!}
var wc : TWndClassEx;//Переменная шаблона класса окна
MainWnd : HWND; //Описатель главного окна
Mesg : TMsg; //Переменная для цикла сбора сообщений
{ Далее следует оконная процедура главного окна. Обратите внимание на служебное
слово stdcall оно вынуждает компилятор генерировать особый вид кода, который
может быть вызван любой windows-программой, без этого служебного слова
программа не сможет работать вообще!}
function WindowProc(wnd:HWND; Msg : Integer; Wparam:Wparam; Lparam:Lparam):Lresult;
stdcall;
Begin
{Далее происходит цикл обработки сообщений}
case msg of
wm_destroy ://Сообщение посылаемое при уничтожении окна
Begin
postquitmessage(0); exit;
Result:=0;
End;
else Result:=DefWindowProc(wnd,msg,wparam,lparam);
end;
End;
{Переменные xPos,yPos,nWidth,nHeight в принципе не нужны, однако я их завел
(и вам рекомендую) для лучшей читабельности программы}
var xPos,yPos,nWidth,nHeight : Integer;
begin
{ Далее идет заполнение шаблона класса окна
подробное описание полей этой записи см. после текста программы}
wc.cbSize:=sizeof(wc);
wc.style:=cs_hredraw or cs_vredraw;
wc.lpfnWndProc:=@WindowProc;
wc.cbClsExtra:=0;
wc.cbWndExtra:=0;
wc.hInstance:=HInstance;
wc.hIcon:=LoadIcon(0,idi_application);
wc.hCursor:=LoadCursor(0,idc_arrow);
wc.hbrBackground:=COLOR_BTNFACE+1;
wc.lpszMenuName:=nil;
wc.lpszClassName:="WinMin : Main";
RegisterClassEx(wc);//Регистрация нового класса в системе
{ Заполнение переменных xPos,yPos,nWidth,nHeight}
xPos:=100;
yPos:=150;
nWidth:=400;
nHeight:=250;
{ Создание главного окна}
MainWnd:=CreateWindowEx(
0, //флаги расширенных стилей
"WinMin : Main", //имя класса окна, данное при заполнении структуры wc
"Win Min", //заголовок окна
ws_overlappedwindow,//флаги стилей окна
{подробнее о стилях см. после текста программы}
xPos, //горизонтальная позиция окна
yPos, //вертикальная позиция окна
nWidth, //ширина окна
nHeight, //высота окна
0, //описатель родительского окна (parent) или окна-владельца (owner)
0, //описатель меню окна (меню нет, нет и описателя)
Hinstance, //описатель приложения
nil //address of window-creation data
);
ShowWindow(MainWnd,CmdShow);//Отображаем окно
//Цикл обработки сообщений
//он может слегка видоизменяться, но эти строчки присутсвуют всегда
While GetMessage(Mesg,0,0,0) do
begin
TranslateMessage(Mesg);
DispatchMessage(Mesg);
end;
end.
← →
handra (2003-05-28 14:31) [8]wm_destroy ://Сообщение посылаемое при уничтожении окна
Begin
postquitmessage(0); exit;
Result:=0;
End;
И здесь нет ошибки?
← →
DVM (2003-05-28 14:41) [9]
> handra ©
Есть конечно, но с фоном не связанная. Работать все равно будет.
← →
Diamond Cat (2003-05-28 19:16) [10]
> Mr. API © (27.05.03 22:34)
>надо MainWnd := CreateWindowEx(0,"wc.lpszClassName",...
> А вот это имхо бред.
вместо того чтоб сказать что надо ковычки убрать, сразу объявляем бредом, гениальный подход.
← →
Mr. API (2003-05-28 19:33) [11]2 Diamond Cat
И еще какая разница писать wc.lpszClassName или то, что только что этой переменной присвоили.
Хотя ладно... Эти разговоры, если честно, ни о чем. :)
← →
Um (2003-05-30 09:34) [12]в свое время столкнулся с той же проблемой
когда скопировал код с примера
всё дело в небольшой ошибке в параметрах
function WindowProc(Wnd: THandle; Msg: Integer;
wParam : ?Word;
lParam: Longint): Integer; stdcall; export;
не хватает буквы D
как с такой ошибкой работает под 98 – вопрос!
function WindowProc(Wnd,Msg,wParam,LParam: dword):dword;stdcall;
← →
Mr. API (2003-05-30 17:01) [13]Всем большое спасибо!
Если честно сейчас просто нет времени более подробно разбираться.
Вот немного освобожусь, тогда...
Еще раз всем спасибо!
← →
Diamond Cat (2003-05-31 01:27) [14]вобщем я был не совсем прав, т.к. не заметил, что ты регистрируешь класс, при таком раскладе ебстественно можно указывать сразу имя класса
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.08.04;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.013 c