Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
2-1141118521
Patrick
2006-02-28 12:22
2006.03.19
Принципиальный вопрос.


6-1134067685
dDan
2005-12-08 21:48
2006.03.19
Ошибка 302 и как с ней бороться (Indy)


15-1141030750
Dok_3D
2006-02-27 11:59
2006.03.19
Borland прощается с ...


15-1140778361
Суслик
2006-02-24 13:52
2006.03.19
Вопрос про перечилимые типы


15-1141037127
TUser
2006-02-27 13:45
2006.03.19
Экспертиза флешки





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский