Форум: "WinAPI";
Текущий архив: 2008.02.17;
Скачать: [xml.tar.bz2];
ВнизИзмение текста static контрола Найти похожие ветки
← →
Денис178 (2007-06-26 02:02) [0]Собирал ресурс:
MAIN_WINDOW DIALOGEX 32768, 0, 258, 130
STYLE DS_MODALFRAME | WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU
CAPTION "Еуые"
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
FONT 8, "MS SANS SERIF"
{
CONTROL "lalala", 3, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 16, 8, 100, 90
}
А как из программы обратиться к этому контролу не знаю. Нужно всего лишь поменять текст надписи. Подскажите пож кто занет.
← →
Однокамушкин (2007-06-26 08:56) [1]Получите хэндл контрола через функцию GetDlgItem, а потом SetWindowText...
← →
Денис178 (2007-06-27 17:35) [2]Благодарю! Получилось
← →
Денис178 (2007-07-05 21:10) [3]Нет, не получилось.. Посмотрите пожалуйста, что не так делаю
program shell;
uses
Windows, Messages, WinSock, SysUtils;
function DlgProc(hWin, uMsg, wParam, lParam: Integer): Integer; stdcall;
var
Cntrl:hWnd;
begin
Result := 0;
case uMsg of
WM_INITDIALOG:
Begin
SendMessage(hWin, WM_SETICON, ICON_BIG, LoadIcon(hInstance, "MAINICON"));
end;
WM_COMMAND:
begin
case LoWord(wParam) of
1: EndDialog(hWin, 0);
2: begin
Cntrl:=GetDlgItem(hWin,3);
SetWindowText(Cntrl,"Hello");
end;
end;
end;
WM_DESTROY, WM_CLOSE: EndDialog(hWin, 0);
end;
end;
begin
{$R shell.res}
DialogBox(hInstance, "MAIN_WINDOW", 0, @DlgProc);
end.
В функции GetDlgItem второй параметр
int nIDDlgItem // identifier of control
этот тот порядковый идентификатор который я указываю в ресурсе?
Спасибо
← →
Dib@zol © (2007-07-06 13:18) [4]
> SetWindowText(Cntrl,"Hello");
SetDlgItemText(HWin, 3, "Твой_текст");
← →
Денис178 (2007-07-06 17:10) [5]Не помогает.. Стыдно, эелементарная вещь, а чё с ней делать не знаю. Уже лет 5 делфю не трогал, забыл всё напрочь.
← →
Dib@zol © (2007-07-06 17:20) [6]Странно... Мож попробуешь так:
for i:=1 to 100 do // границы проверки выбирай сам
SendDlgItemMessage(HWin, i, WM_DESTROY, 0, 0);
и запускай в режиме отладки. На каком проходе цикла метка удалится - тот и идентификатор. Как видно, он явно не 3.
Или другой вариант. Ты как находишь хендл диалога-родителя? Засвети код. Очвозможно что ты там накосячил.
← →
clickmaker © (2007-07-06 17:35) [7]
> [2] Денис178 (27.06.07 17:35)
> Благодарю! Получилось
>
> [3] Денис178 (05.07.07 21:10)
> Нет, не получилось..
хм... то есть все-таки один раз получилось?
сам контрол-то хоть создается?
← →
Денис178 (2007-07-06 18:20) [8]Не то чтобы получилось, просто вспомнил что когда то пользовался этим, но забыл что это диалоговое окно, а тут немного по другому. контрол создаётся с тем текстом который описал в ресурсе. а вот менять текст не позволяет. Может можно как нибудь в диалоговом окне просто пройтись по всем контролам, найти нужный лэйбл, и обычным способом поменять заголовок? Или может как то можно продиагностировать почему эта фнукция не сработала?
← →
Однокамушкин (2007-07-07 09:11) [9]
> Денис178 (06.07.07 18:20) [8]
> Или может как то можно продиагностировать почему эта фнукция
> не сработала?
Анализировать возвращаемый результат, вызывать GetLastError...
← →
Денис178 (2007-07-07 19:14) [10]> Dib@zol
SendDlgItemMessage(HWin, i, WM_DESTROY, 0, 0); вот это не убило мою метку, что очень странно.. и вообще ничего убило. там в ресурсе ещё кнопка есть
> Ты как находишь хендл диалога-родителя?
ну вызывается же оконная функция DlgProc в которой hWin как я понимаю и есть хендл родителя. вот код:
function DlgProc(hWin, uMsg, wParam, lParam: Integer): Integer; stdcall;
var
Cntrl:hWnd;
i:integer;
s:pchar;
begin
Result := 0;
case uMsg of
WM_INITDIALOG:
Begin
SendMessage(hWin, WM_SETICON, ICON_BIG, LoadIcon(hInstance, "MAINICON"));
end;
WM_COMMAND:
begin
case LoWord(wParam) of
1: EndDialog(hWin, 0);
2: begin
SetDlgItemText(hWin, 4, "aaa");
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM,
nil, getlasterror, 0, @s, 0, nil);
ShowMessage(s);
end;
end;
end;
WM_DESTROY, WM_CLOSE: EndDialog(hWin, 0);
end;
end;
begin
{$R shell_new.res}
DialogBox(hInstance, "MAIN_WINDOW", 0, @DlgProc);
end.
а теперь самое интересное, странное, но работающее..
function chlabel(hWin:integer):integer;
begin
SetDlgItemText(hWin, 4, "aaa");
end;
function DlgProc(hWin, uMsg, wParam, lParam: Integer): Integer; stdcall;
var
Cntrl:hWnd;
i:integer;
s:pchar;
begin
Result := 0;
case uMsg of
WM_INITDIALOG:
Begin
SendMessage(hWin, WM_SETICON, ICON_BIG, LoadIcon(hInstance, "MAINICON"));
end;
WM_COMMAND:
begin
case LoWord(wParam) of
1: EndDialog(hWin, 0);
2: chlabel(hWin);
end;
end;
WM_DESTROY, WM_CLOSE: EndDialog(hWin, 0);
end;
end;
begin
{$R shell_new.res}
DialogBox(hInstance, "MAIN_WINDOW", 0, @DlgProc);
end.
этот код меняет текст мекти, предидущий НЕТ, почему так происходит мыслей тоже нет..
← →
Денис178 (2007-07-07 19:15) [11]остался спортивный интерес:)
ПОЧЕМУ ТАК ПРОИСХОДИТ??
← →
Dib@zol © (2007-07-07 20:43) [12]Хм. Возможно дело в компиляторе. У меня например, если в обработчике какого-то сообщения реализован цикл, то прога (даже если это сообщение ей нифжисть не слали) просто виснет намертво. Если же цикл выносится в отдельную процедуру, то всё идёт пучком. Как видно, это из той же оперы.
← →
Денис178 (2007-07-07 23:35) [13]мда.. загадочное явление
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2008.02.17;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.043 c