Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

На API диалоговое окно для ввода пароля? (звездочки) [D6, Win2k]


Sasha73 ©   (2005-12-21 18:26:00) 

Добрый день!
Подскажите как в программе без формы, т.е. вида:
Program Shifr;
Uses
 Windows;
Var
  a, b : Byte;
BEGIN
 a:=b
END.

на API вызвать Edit для ввода пароля, т.е. звездочки вместо текста?
Если можно, то порядок функций или ссылочку - в API явно не силен, если такое спрашиваю! ;-)
Заранее СПАСИБО!


Игорь Шевченко   (2005-12-28 14:29:00) [1]


> А где бы взять описание этого языка, что бы шире использовать
> его возможности?


http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/resources.asp


Sasha73   (2005-12-28 14:13:00) [2]

Спасибо, во все разобрался, все работает


> тогда придётся разобраться в языке, используемом в файлах
> ресурсов


Ресурс создан, благо примеры есть!

А где бы взять описание этого языка, что бы шире использовать его возможности?


begin...end   (2005-12-23 18:35:00) [3]

> Sasha73 ©   (23.12.05 18:22) [7]
> А вот как бесплатно создать и скомпилировать?

Создать -- вручную в Блокноте (тогда придётся разобраться в языке, используемом в файлах ресурсов), или с помощью специального редактора ресурсов. Скомпилировать -- компилятором ресурсов (например, {Delphi}\Bin\brcc32.exe).


Sasha73   (2005-12-23 18:22:00) [4]


> Все гораздо проще - DialogBox

  Вроде уже знаю что это, но не могу придумать как и чем откомпилировать файл ресурсов в Delphi 6 и куда его вставить?
  Вставить, наверное, так {$R *.RES}?
  А вот как бесплатно создать и скомпилировать?


Игорь Шевченко   (2005-12-22 12:21:00) [5]

Все гораздо проще - DialogBox


Sasha73   (2005-12-22 11:14:00) [6]

Огромное спасибо!

Думаю теперь мои познания в создинии окон на API сильно расширятся и есть направление для изучения!

ВСЕХс наступающим праздником!


Rouse_   (2005-12-22 09:24:00) [7]

:) А у меня вот такой примерчик :)

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.


VirEx   (2005-12-21 19:26:00) [8]

появляется окно и пока не введешь слово 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.


VirEx   (2005-12-21 19:01:00) [9]

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.


Sasha73   (2005-12-21 18:49:00) [10]

Чо-то наподобии InputBox, только со звездочками!


Наверх

Титульная страница Поиск, карта сайта Написать письмо