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

Вниз

На 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 вся ветка

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

Наверх




Память: 0.51 MB
Время: 0.045 c
15-1140903519
DillerXX
2006-02-26 00:38
2006.03.19
Посмотрите что я творил ;)


6-1133432922
xmlBeginner
2005-12-01 13:28
2006.03.19
парсим xml с помощью msxml_tlb.pas


1-1139837066
Gamer
2006-02-13 16:24
2006.03.19
Работа с файлом и несколькими RichEdit ами


3-1138250784
Личность
2006-01-26 07:46
2006.03.19
Странный INSERT в БД


4-1133446523
lucifer
2005-12-01 17:15
2006.03.19
как получить хэндл окна, находящегося под курсором мыши?