Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
6-10344
MetalFan
2003-05-28 13:43
2003.08.04
TPowersock


1-10279
mmm
2003-07-21 21:40
2003.08.04
как работать с ShellListView ?


3-10132
inspirion
2003-07-14 20:16
2003.08.04
рухнула база


1-10241
edit_box
2003-07-19 12:09
2003.08.04
Microsoft Office 2000


1-10173
Yanis
2003-07-23 01:19
2003.08.04
Как сделать консольную программу?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский