Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.08.04;
Скачать: CL | DM;

Вниз

Окно копирует фон в 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 вся ветка

Текущий архив: 2003.08.04;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.014 c
1-10223
Феликс
2003-07-21 00:23
2003.08.04
Как открыть окно состоящее только из заголовка.


1-10291
Alex300
2003-07-22 09:33
2003.08.04
Проблема с курсором


1-10240
Spawn
2003-07-20 07:16
2003.08.04
Rave


4-10507
Pashik
2003-06-01 13:36
2003.08.04
Добавление юзера к файлу


3-10115
abc
2003-07-14 10:50
2003.08.04
как не визуальными средствами создать вычисляемое поле?