Форум: "WinAPI";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];
ВнизНа API диалоговое окно для ввода пароля? (звездочки) Найти похожие ветки
← →
Sasha73 © (2005-12-21 18:26) [0]Добрый день!
Подскажите как в программе без формы, т.е. вида:Program Shifr;
Uses
Windows;
Var
a, b : Byte;
BEGIN
a:=b
END.
на API вызвать Edit для ввода пароля, т.е. звездочки вместо текста?
Если можно, то порядок функций или ссылочку - в API явно не силен, если такое спрашиваю! ;-)
Заранее СПАСИБО!
← →
Sasha73 © (2005-12-21 18:49) [1]Чо-то наподобии InputBox, только со звездочками!
← →
VirEx © (2005-12-21 19:01) [2]program Small;
uses
windows,
messages;
//{$R *.RES}
var
Instance: HWnd;
WindowClass: TWndClass;
Handle,EdHandle: HWnd;
msg: TMsg;
ExtFlag:Boolean;
procedure DoExit;
begin
ExtFlag:=true;
end;
function WindowProc (Hwn,msg,wpr,lpr: longint): longint; stdcall;
begin
result:=defwindowproc(hwn,msg,wpr,lpr);
if msg=wm_destroy then
DoExit;
if msg=wm_KeyDown then
//if wpr=VK_ESCAPE then
DoExit;
end;
procedure Main;
label Ext;
begin
instance :=GetModuleHandle(nil);
WindowClass.style:=CS_HRedraw or CS_VRedraw;
WindowClass.Lpfnwndproc:=@windowproc;
WindowClass.Hinstance:=Instance;
WindowClass.HbrBackground:= color_btnface;
WindowClass.LpszClassName:="DX";
WindowClass.Hcursor:=LoadCursor(0,IDC_ARROW);
RegisterClass(WindowClass);
Handle:=CreateWindowEx (0,"DX","",WS_CAPTION or WS_SYSMENU, 5,5, GetSystemMetrics (SM_CXSCREEN)-300, 50,0,0,instance, nil);
EdHandle:=CreateWindowEx(0,"EDIT","",ES_PASSWORD or WS_BORDER or WS_CHILD, 0,0, 300,20 ,handle,0,instance, nil);
//UpdateWindow (Handle);
ShowWindow(Handle,SW_SHOW);
ShowWindow(EdHandle,SW_SHOW);
while (GetMessage(msg, 0, 0, 0)) do
begin
if ExtFlag then Goto Ext;
translatemessage(msg);
dispatchmessage (msg);
end;
Ext:
end;
begin
ExtFlag:=false;
Main;
end.
← →
VirEx © (2005-12-21 19:26) [3]появляется окно и пока не введешь слово exit оно не закроется
program Small;
uses
windows,
messages;
//{$R *.RES}
var
Instance: THandle;
EdHandle: HWnd;
msg: TMsg;
ExtFlag:Boolean;
OldEditProc:Pointer;
procedure DoExit;
begin
ExtFlag:=true;
end;
function WindowProc (Hwn,msg,wpr,lpr: longint): longint; stdcall;
var
buff:PChar;
begin
result:=CallWindowProc(OldEditProc,EdHandle,Msg,wPr,Lpr); //msg
//смотрим какое сообщение пришло
case msg of
//нажали клавишу
wm_keydown:
//смотрим что нажали
case wpr of
//нажали Enter
vk_return:begin
getmem(buff,255);
SendMessage(Hwn,wm_gettext,255,integer(buff));
if buff="exit" then ExtFlag:=true;
end;
end;
end;
end;
procedure Main;
label Ext;
begin
instance :=GetModuleHandle(nil);
//делаем окно
EdHandle:=CreateWindowEx(0,"EDIT","",ES_PASSWORD or ES_CENTER or WS_BORDER, 0,0, GetSystemMetrics (SM_CXSCREEN)-300,50 ,0,0,instance, nil);
//делаем стиль окна незакрывающимся чтобы не закрыть его при нажатии ctrl+F4
SetClassLong(EdHandle,GCL_STYLE,CS_NOCLOSE);
//запоминаем процедуру обработки сообщений от windows к полю ввода - EDIT (чтобы перехватывать только то что нам нужно а остальное - перерисовка окна и т.п. оставить самому компоненту системы - EDIT"у )
OldEditProc:=Pointer(GetWindowLong(EdHandle,GWL_WNDPROC));
//устанавливаем свою процедуру обработки сообщений
SetWindowLong(EdHandle,GWL_WNDPROC,Integer(@WindowProc));
//показываем окно
ShowWindow(EdHandle,SW_SHOW);
while (GetMessage(msg, 0, 0, 0)) do
begin
if ExtFlag then Goto Ext;
translatemessage(msg);
dispatchmessage (msg);
end;
Ext:
end;
begin
ExtFlag:=false;
Main;
end.
← →
Rouse_ © (2005-12-22 09:24) [4]:) А у меня вот такой примерчик :)
program Access;
uses
Windows,
Messages;
resourcestring
TXT_CAPTION = "Ввод пароля";
TXT_INSTALL = "Принять";
TXT_CANCEL = "Отмена";
TXT_STATUS = "Введите пароль:";
TXT_NEWUSER = "Значение пароля: ";
var
MainWindow : TWndClassEx;
Handle,
hFontNormal,
btnOk,
btnCancel,
Edit,
Label1 : HWND;
Msg : TMsg;
Left,
Top,
Width,
Height : Integer;
const
BTN_APPLY_ID = 100;
BTN_CANCEL_ID = 105;
EDIT_ID = 110;
// Центрирование формы
// =============================================================================
procedure CenterMainForm;
var
ScrWidth, ScrHeight: Cardinal;
begin
ScrWidth := GetSystemMetrics(SM_CXSCREEN);
ScrHeight := GetSystemMetrics(SM_CYSCREEN);
Left := (Integer(ScrWidth) - Width) div 2;
Top := (Integer(ScrHeight) - Height) div 2;
end;
// Главная оконная процедура
// =============================================================================
function WindowProc(Wnd: HWND; Msg: Integer;
WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;
var
S: String;
Len: Integer;
DC: HDC;
begin
Result := 0;
case Msg of
WM_DESTROY:
begin
PostQuitMessage(0);
Result:=0;
end;
WM_COMMAND:
begin
case LoWord(WParam) of
BTN_APPLY_ID: // Нажатие на кнопку "Принять"
begin
Len := SendMessage(Edit, WM_GETTEXTLENGTH, 0, 0);
Inc(Len);
SetLength(S, Len);
SendMessage(Edit, WM_GETTEXT, Len, Integer(@S[1]));
MessageBox(Handle, PChar(TXT_NEWUSER + S), PChar(TXT_CAPTION), MB_OK);
PostQuitMessage(0);
Result := 0;
end;
BTN_CANCEL_ID: // Нажатие на кнопку "Отмена"
begin
PostQuitMessage(0);
Result := 0;
end;
EDIT_ID: // Обработчик Edit-а
// В зависимости от кол-ва символов, включаем/отключаем кнопку "Принять"
EnableWindow(btnOk, Boolean(SendMessage(Edit, WM_GETTEXTLENGTH, 0, 0)));
end;
end;
WM_CTLCOLORSTATIC: // Изменения цвета STATIC
begin
if LParam = Label1 then
begin
Result := DefWindowProc(Wnd, Msg, WParam, LParam);
SetTextColor(WParam, $FF0000);
end;
end;
else
Result := DefWindowProc(Wnd, Msg, WParam, LParam);
end;
end;
// Здесь программа стартует
// =============================================================================
begin
// Инициализируем оконный класс
with MainWindow do
begin
cbSize := SizeOf(MainWindow);
style := CS_HREDRAW or CS_VREDRAW;
lpfnWndProc := @WindowProc;
cbClsExtra := 0;
cbWndExtra := 0;
hIcon := LoadIcon(0, IDI_APPLICATION);
hCursor := LoadCursor(0, IDC_ARROW);
hbrBackground := COLOR_BTNFACE + 1;
lpszMenuName := nil;
lpszClassName := "TAccessForm";
end;
MainWindow.hInstance := HInstance;
// Регистрируем оконный класс
if RegisterClassEx(MainWindow) = 0 then Exit;
// Подготавливаем координаты для центрирования формы
Width := 360;
Height := 130;
CenterMainForm;
// Создаем форму
Handle := CreateWindow("TAccessForm",
PChar(TXT_CAPTION), WS_OVERLAPPED or WS_SYSMENU,
Left, Top, Width, Height, 0, 0, HInstance, nil);
// Создаем кнопку "Принять"
btnOk := CreateWindow("BUTTON", PChar(TXT_INSTALL),
BS_PUSHBUTTON or WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,
270, 65, 75, 25, Handle, BTN_APPLY_ID, hInstance, nil);
// Отключаем ее до ввода пароля
EnableWindow(btnOk, False);
// Создаем кнопку "Отмена"
btnCancel := CreateWindow("BUTTON", PChar(TXT_CANCEL),
BS_PUSHBUTTON or WS_CHILD or WS_VISIBLE,
190, 65, 75, 25, Handle, BTN_CANCEL_ID, hInstance, nil);
// Создаем поле ввода
Edit := CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", nil, WS_CHILD or WS_VISIBLE,
10, 30, 335, 21, Handle, EDIT_ID, HInstance, nil);
// Задаем симфол который будет отображаться ри вводе пароля
SendMessage(Edit, EM_SETPASSWORDCHAR, Ord("*"), 0);
// Создаем Label
Label1 := CreateWindow("STATIC", PChar(TXT_STATUS),
WS_VISIBLE or WS_CHILD, 10, 13, 230, 14, Handle, 0, hInstance, nil);
// Создаем нужный шрифт
hFontNormal := CreateFont(-11, 0, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH or FF_DONTCARE, "MS Sans Serif");
// назначаем этот шрифт всем оконным элементам
if hFontNormal <> 0 then
begin
SendMessage(btnOk, WM_SETFONT, hFontNormal, 0);
SendMessage(btnCancel, WM_SETFONT, hFontNormal, 0);
SendMessage(Edit, WM_SETFONT, hFontNormal, 0);
SendMessage(Label1, WM_SETFONT, hFontNormal, 0);
end;
// Показываем окно
ShowWindow(Handle, SW_SHOW);
// Ставим его поверх всех
SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0,
SWP_NOSIZE or SWP_NOMOVE);
// Ставим фокус в поле ввода
SetFocus(Edit);
// Начинаем крутить цикл выборки сообщений
while GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end.
← →
Sasha73 © (2005-12-22 11:14) [5]Огромное спасибо!
Думаю теперь мои познания в создинии окон на API сильно расширятся и есть направление для изучения!
ВСЕХ с наступающим праздником!
← →
Игорь Шевченко © (2005-12-22 12:21) [6]Все гораздо проще - DialogBox
← →
Sasha73 © (2005-12-23 18:22) [7]
> Все гораздо проще - DialogBox
Вроде уже знаю что это, но не могу придумать как и чем откомпилировать файл ресурсов в Delphi 6 и куда его вставить?
Вставить, наверное, так {$R *.RES} ?
А вот как бесплатно создать и скомпилировать?
← →
begin...end © (2005-12-23 18:35) [8]> Sasha73 © (23.12.05 18:22) [7]
> А вот как бесплатно создать и скомпилировать?
Создать -- вручную в Блокноте (тогда придётся разобраться в языке, используемом в файлах ресурсов), или с помощью специального редактора ресурсов. Скомпилировать -- компилятором ресурсов (например, {Delphi}\Bin\brcc32.exe).
← →
Sasha73 © (2005-12-28 14:13) [9]Спасибо, во все разобрался, все работает
> тогда придётся разобраться в языке, используемом в файлах
> ресурсов
Ресурс создан, благо примеры есть!
А где бы взять описание этого языка, что бы шире использовать его возможности?
← →
Игорь Шевченко © (2005-12-28 14:29) [10]
> А где бы взять описание этого языка, что бы шире использовать
> его возможности?
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/resources.asp
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.013 c