Casa
Top.Mail.Ru Yandeks.Metrika
Foro: "WinAPI";
Archivo actual: 2002.01.08;
Descargar: [xml.tar.bz2];

abajo

¿Cómo crear formularios con diferentes controles en una API pura? Encontrar ramas similares


Oxy2   (2001-10-23 23:23) [0]

Hola a todos!

¿Alguien puede enviarme o al menos decirme dónde puede obtener ejemplos simples de creación de formularios, diferentes controles en ellos, creación de controladores de eventos para estos controles, etc. en una API pura (en Delphi o, como último recurso, en C). En general, ejemplos simples de programación en la API.



Jochua   (2001-10-24 06:25) [1]

Déjame decirte lo que sé.



Oxy2   (2001-10-25 00:55) [2]

Bueno, por ejemplo, esto. Es necesario hacer un formulario en el que habrá un ListView y dos botones (Botón). Debería ser posible manejar eventos desde botones y desde ListView.



Иван Шихалев   (2001-10-25 01:10) [3]

¿Por qué WM_COMMAND y WM_NOTIFY no son convenientes para usted?



Alien   (2001-10-25 02:51) [4]

> Oxy2
Olvida los eventos. No hay eventos en la API de Win. Hay mensajes, aquí y procesarlos.



Jochua   (2001-10-25 08:01) [5]

Mira, de alguna manera hice un ejemplo con la misma solicitud:

program listbox;

uses
windows, messages;

var
wc : TWndClassEx;
Wnd : HWND;
Msg : TMsg;

function WindowProc(wnd : HWND; Msg : Integer; WParam : WParam; LParam : Longint): Longint; stdcall;
const
BUFFER = MAX_PATH;
var
I : Integer;
CurDir : array[0..BUFFER-1] of Char;

Begin
Result := 0;
case msg of

wm_destroy :
Begin
postquitmessage(0);
exit;
Result:=0;
End;

wm_command :
Begin
case loword(wParam) of
200 :
case hiWord(wParam) of
lbn_selchange :
begin
I := SendMessage(lParam, LB_GETCURSEL, 0, 0);
SendMessage(lParam, LB_GETTEXT, I, Integer(@CurDir));
SetWindowText(GetDlgItem(Wnd, 222), CurDir);
end;
lbn_dblclk :
begin
I := SendMessage(lParam, LB_GETCURSEL, 0, 0);
SendMessage(lParam, LB_GETTEXT, I, Integer(@CurDir));
SetWindowText(GetDlgItem(Wnd, 221), CurDir);
end;
end;

100 :
begin
GetCurrentDirectory(SizeOf(CurDir), CurDir);
DlgDirList(Wnd, CurDir, 200, 0, DDL_DIRECTORY);
end;

end;
End;
else
Result := DefWindowProc(wnd, msg, wparam, lparam);
end;
End;

begin
wc.cbSize := sizeof(wc);
wc.style := cs_hredraw or cs_vredraw;
wc.lpfnWndProc := @WindowProc;
wc.cbClsExtra := 0;
wc.cbWndExtra := 0;
wc.hInstance := HInstance;
wc.hIcon := LoadIcon(0, IDI_APPLICATION);
wc.hCursor := LoadCursor(0, idc_arrow);
wc.hbrBackground := COLOR_BTNFACE + 1;
wc.lpszMenuName := nil;
wc.lpszClassName := "listbox example";

RegisterClassEx(wc);

Wnd := CreateWindowEx(0, "listbox example", "ListBoxes Demo",
ws_overlapped or ws_sysmenu,
100, 150, 360, 200,
0, 0,
Hinstance, nil);

CreateWindowEx(WS_EX_CLIENTEDGE, "LISTBOX", NIL, WS_BORDER or LBS_NOTIFY or WS_CHILD or WS_VISIBLE or LBS_MULTICOLUMN or LBS_SORT or LBS_EXTENDEDSEL, 10, 70, 200, 100, Wnd, 200, hInstance, NIL);

CreateWindowEx(0, "STATIC", "dbl_click:", WS_VISIBLE or WS_CHILD, 10, 10, 60, 20, Wnd, 0, hInstance, NIL);
CreateWindowEx(0, "STATIC", NIL, WS_VISIBLE or WS_CHILD, 75, 10, 300, 20, Wnd, 221, hInstance, NIL);

CreateWindowEx(0, "STATIC", "Select:", WS_VISIBLE or WS_CHILD, 10, 40, 60, 20, Wnd, 0, hInstance, NIL);
CreateWindowEx(0, "STATIC", NIL, WS_VISIBLE or WS_CHILD, 75, 40, 300, 20, Wnd, 222, hInstance, NIL);

CreateWindowEx(0, "BUTTON", "Scan Directory", BS_PUSHBUTTON or WS_CHILD or WS_VISIBLE, 220, 130, 120, 25, Wnd, 100, hInstance, NIL);

ShowWindow(Wnd, CmdShow);

While GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end.




Jochua   (2001-10-25 08:03) [6]

Mira, de alguna manera hice un ejemplo con la misma solicitud:

program listbox;

uses
windows, messages;

var
wc : TWndClassEx;
Wnd : HWND;
Msg : TMsg;

function WindowProc(wnd : HWND; Msg : Integer; WParam : WParam; LParam : Longint): Longint; stdcall;
const
BUFFER = MAX_PATH;
var
I : Integer;
CurDir : array[0..BUFFER-1] of Char;

Begin
Result := 0;
case msg of

wm_destroy :
Begin
postquitmessage(0);
exit;
Result:=0;
End;

wm_command :
Begin
case loword(wParam) of
200 :
case hiWord(wParam) of
lbn_selchange :
begin
I := SendMessage(lParam, LB_GETCURSEL, 0, 0);
SendMessage(lParam, LB_GETTEXT, I, Integer(@CurDir));
SetWindowText(GetDlgItem(Wnd, 222), CurDir);
end;
lbn_dblclk :
begin
I := SendMessage(lParam, LB_GETCURSEL, 0, 0);
SendMessage(lParam, LB_GETTEXT, I, Integer(@CurDir));
SetWindowText(GetDlgItem(Wnd, 221), CurDir);
end;
end;

100 :
begin
GetCurrentDirectory(SizeOf(CurDir), CurDir);
DlgDirList(Wnd, CurDir, 200, 0, DDL_DIRECTORY);
end;

end;
End;
else
Result := DefWindowProc(wnd, msg, wparam, lparam);
end;
End;

begin
wc.cbSize := sizeof(wc);
wc.style := cs_hredraw or cs_vredraw;
wc.lpfnWndProc := @WindowProc;
wc.cbClsExtra := 0;
wc.cbWndExtra := 0;
wc.hInstance := HInstance;
wc.hIcon := LoadIcon(0, IDI_APPLICATION);
wc.hCursor := LoadCursor(0, idc_arrow);
wc.hbrBackground := COLOR_BTNFACE + 1;
wc.lpszMenuName := nil;
wc.lpszClassName := "listbox example";

RegisterClassEx(wc);

Wnd := CreateWindowEx(0, "listbox example", "ListBoxes Demo",
ws_overlapped or ws_sysmenu,
100, 150, 360, 200,
0, 0,
Hinstance, nil);

CreateWindowEx(WS_EX_CLIENTEDGE, "LISTBOX", NIL, WS_BORDER or LBS_NOTIFY or WS_CHILD or WS_VISIBLE or LBS_MULTICOLUMN or LBS_SORT or LBS_EXTENDEDSEL, 10, 70, 200, 100, Wnd, 200, hInstance, NIL);

CreateWindowEx(0, "STATIC", "dbl_click:", WS_VISIBLE or WS_CHILD, 10, 10, 60, 20, Wnd, 0, hInstance, NIL);
CreateWindowEx(0, "STATIC", NIL, WS_VISIBLE or WS_CHILD, 75, 10, 300, 20, Wnd, 221, hInstance, NIL);

CreateWindowEx(0, "STATIC", "Select:", WS_VISIBLE or WS_CHILD, 10, 40, 60, 20, Wnd, 0, hInstance, NIL);
CreateWindowEx(0, "STATIC", NIL, WS_VISIBLE or WS_CHILD, 75, 40, 300, 20, Wnd, 222, hInstance, NIL);

CreateWindowEx(0, "BUTTON", "Scan Directory", BS_PUSHBUTTON or WS_CHILD or WS_VISIBLE, 220, 130, 120, 25, Wnd, 100, hInstance, NIL);

ShowWindow(Wnd, CmdShow);

While GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end.




Oxy2   (2001-10-25 23:50) [7]

Hola a todos!

2Ivan Shikhalev
> ¿Por qué WM_COMMAND y WM_NOTIFY no son adecuados para usted?
Puede que me convengan, pero aún no lo sé. :-)))
Bueno, escribí que solo estoy aprendiendo programación en una API pura. Anteriormente, también usaba la API, pero solo algunas de las funciones individuales que necesitaba, y todavía estoy aprendiendo en una API pura. Por ahora, solo sé cómo crear ventanas y procesar sus mensajes. En principio, intenté crear otros controles en la ventana, pero para cada uno creé una función de ventana separada. Realmente no me gustó (y si tengo botones 100) y pensé que tal vez hay formas más simples. Por lo tanto, hizo esta pregunta.

2 Alien
> Para eventos, olvídalo. No hay eventos en la API de Win. Hay mensajes, aquí están y> proceso.
Sé que en Windows no son eventos, sino messagi. Simplemente, por costumbre, se rompió. :-))

2Jochua
ENORMES gracias por el ejemplo. Pero tengo una pregunta otra vez. Me gustaría usar ListView, no ListBox. No me digas qué nombre de clase tiene.



Jochua   (2001-10-26 06:28) [8]

Abrimos el archivo rw32core.dll (está en BIN en Delphi) y encontramos - SysListView32. Si crea objetos a través de WinAPI, no pase por esta biblioteca. Y allí se declara todo lo que Delphi puede entender. Luego abrimos Messages.pas - esto es Source / RTL / Win - y miramos todos los mensajes en el objeto que necesitamos.



Oxy2   (2001-10-26 23:34) [9]

2Jochua
No entendí nada en absoluto. Y cómo entonces VC ++ sin este rw32core.dll funciona. Entonces escribo en lugar de crear un ListBox en su ejemplo, como una línea

CreateWindowEx (WS_EX_CLIENTEDGE, "SysListView32", NIL, WS_CHILD o
WS_VISIBLE O WS_VSCROLL O WS_BORDER O WS_CLIPSIBLINGS, 10, 70, 200, 100, Wnd, 200, hInstance, NIL);

Pero ListView no quiere crear nada en un arco. Aparece una ventana, pero no hay ListView en ella.



Jochua   (2001-10-29 10:04) [10]

Este archivo es necesario solo para Delphi, para VC ++ todas las descripciones están en archivos con la extensión ".H". Simplemente marcó (D5, Win98) todo funciona. Si lo deseas puedes escribir en el jabón, en una de las respuestas está la dirección.



nikkie   (2001-10-29 13:35) [11]

> Joshua
Algunas tonterías. ¿Dónde funciona rw32core.dll?
el nombre de su producto es Borland Resource Compiler DLL
no ext. No se requieren bibliotecas de Borland cuando se escribe en api.

> Oxy2
Se requiere llamar a InitCommonControlsEx antes de usar los controles comunes



Jochua   (2001-10-29 13:53) [12]

> nikkie
No es ninguna tontería. Mire cuidadosamente, ¡BRCC32 llama a esta biblioteca durante su trabajo y !!! Si no encuentra el componente declarado de WinAPI, se negará a compilar. InitCommonControlsEx naturalmente requiere una llamada.



nikkie   (2001-10-29 14:05) [13]

ejecute brcc32 y lea el "Compilador de recursos de Borland". ¿Y de dónde viene?



Иван Шихалев   (2001-10-29 20:22) [14]

> Jochua

¿Qué clase de bestia es esta? "componente declarado de WinAPI"



kowdle   (2001-10-30 00:07) [15]

Vaya a ... KOL http://bonanzas.rinet.ru/rindex.htm



Jochua   (2001-10-30 06:18) [16]

Bueno, si miras detenidamente lo que se escribió anteriormente, había una pregunta:
Me gustaría usar ListView, no ListBox. No me digas qué nombre de clase tiene.
a lo que se respondió:
Abra el archivo rw32core.dll (está en el BIN de Delphi) y busque SysListView32.
Me gustaría saber cómo aquellos que saben demasiado pueden compilar un proyecto que utiliza un componente que no se describe en esta biblioteca. Tenga en cuenta también que el autor de la pregunta no ha estado involucrado en este lenguaje durante mucho tiempo, también me desconecto. Solo responderé al autor.



nikkie   (2001-10-30 09:40) [17]

> Jochua
ok desconectate Solo unas pocas palabras para ponernos al día.

a la pregunta del autor "qué nombre de clase" hay 2 de respuestas lógicas
1 miramos una ayuda (MSDN o Win32 SDK): vemos WC_LISTVIEW. Allí encontramos un ejemplo.

2 mire las clases de VCL, a saber, commctrl.pas y comctrls.pas. vemos la declaración WC_LISTVIEW allí y un montón de código interesante, por ejemplo, una forma segura de usar InitCommonControlsEx.

Sobre tu respuesta. "Abrimos el archivo rw32core.dll", ¿está en el bloc de notas "e, o qué? Y si veo a BorBtn, BorRadio, ... - ¿Esto tiene algo que ver con WinAPI? Y si veo" VasjaPupkin "allí, ¿puedo intentarlo? crear una ventana de esta clase?

algunas de tus citas por las cuales me aferré.

"Si crea objetos a través de WinAPI, no puede pasar esta biblioteca [rw32core.dll]. Y allí se declara todo lo que Delphi puede entender". [caminando con calma. y Oxy2 pasó por ...]

"Este archivo es necesario solo para Delphi, con VC ++ todas las descripciones están en archivos con la extensión" .H "." [la analogía entre rw32core.dll y los encabezados sysnaya, por decirlo suavemente, no está clara]

Estas citas dan un poco de desorden que tiene en su cabeza con respecto a este tema. si no quieres desmontarlo, por el amor de Dios, no cargues a otros.



_   (2001-10-30 14:49) [18]

> nikkie
Qué pena que estos idiotas visiten estos foros. Muy mal Y la ambición: no dejarse llevar.



Oxy2   (2001-11-01 00:04) [19]

Hi!

Gracias a todos por el consejo. Perdón por no participar. Acabo de tener una sesión ahora: corrí y no leí el correo durante un par de días.
Y no necesito jurar por mi culpa, de lo contrario al final seré culpable por hacer una pregunta. Y realmente no quiero esto. :-))

Ahora al grano. Por sus respuestas, finalmente entendí por qué no se creó este ListView. Era necesario llamar a la función InitCommonControlsEx antes de la creación, pero no hice esto (porque no sabía nada al respecto). Pero ahora todo está bien y ListView se está creando normalmente. Es cierto que tengo un pequeño éxito con InitCommonControlsEx a la izquierda. Es necesario transferir alguna estructura a esta función. No tenía idea de qué hacer y simplemente utilicé la función InitCommonControls. Todo funciona bien, pero sigue siendo interesante lo que hace la función InitCommonControlsEx.
¿Alguien puede explicar claramente?
¿Y cuál es esta forma segura de usar InitCommonControlsEx?



nikkie   (2001-11-01 09:46) [20]

de hecho, todo está escrito en MSDN.

nulo InitCommonControls (VOID);
Registra e inicializa las clases de ventana de control comunes. Esta función es obsoleta. Las nuevas aplicaciones deben usar la función InitCommonControlsEx.

en resumen, microsoft dice que necesita usar InitCommonControlsEx. Además, es más flexible. La estructura consta de solo campos 2, por lo que es muy fácil de usar

var
ICC: TInitCommonControlsEx;
comenzar
ICC.dwSize: = SizeOf (TInitCommonControlsEx);
ICC.dwICC: =
ICC_LISTVIEW_CLASSES | ICC_TREEVIEW_CLASSES | ICC_TAB_CLASSES;
// enumera las clases que vamos a usar
InitCommonControlsEx (ICC);
fin;

solo hay uno pero. en la ayuda de la ayuda de InitCommonControlsEx dice la versión 4.70. Aquí está la transcripción.
Plataforma de distribución de versiones
4.00 Microsoft® Windows® 95 / Windows NT® 4.0.
4.70 Microsoft® Internet Explorer 3.x.
4.71 Microsoft® Internet Explorer 4.0.
4.72 Microsoft® Internet Explorer 4.01 y Windows® 98.
5.00 Microsoft® Internet Explorer 5.
5.00 Microsoft® Windows® 2000 y Windows Me.
5.80 Microsoft® Internet Explorer 5.
5.81 Microsoft® Windows 2000 y Windows Me.
6.00 Microsoft® Windows XP.

es decir, siempre que el usuario tenga Win95 sin ningún IE, esta función no aparecerá en comctl32.dll. La situación es difícil de imaginar, pero posible :).

Pero delphi (o más bien, commctrl.pas) nos ayuda. InitCommonControlsEx se carga dinámicamente, no estáticamente. Además, como _InitCommonControlsEx, y InitCommonControlsEx es solo una función pascal
Resultado: = Asignado (_InitCommonControlsEx) y _InitCommonControlsEx (ICC);

Opción 1. solo use InitCommonControlsEx
Opción 2. Estamos muy preocupados por el problema de ejecutar nuestro programa en Win95 sin IE y estamos escribiendo algo así como
if (no InitCommonControlsEx (ICC)) entonces InitCommonControls;
Opción 3. no nos engañamos y usamos InitCommonControls. aunque es obsoleto, pero 100% que MS no lo arrojará en futuras versiones.



Páginas: 1 rama entera

Foro: "WinAPI";
Archivo actual: 2002.01.08;
Descargar: [xml.tar.bz2];

arriba





Memoria: 0.65 MB
Tiempo: 0.034 c
14-22331
vasco
2001-10-26 17:57
2002.01.08
¿Hay muchos zurdos entre los programadores?


1-22079
kserg@ukr.net
2001-12-19 13:11
2002.01.08
¿Cómo asociar correctamente un botón con ToolBara con un elemento de menú en MainMenu?


3-21897
Maxb
2001-11-27 14:33
2002.01.08
DBMS Cache


1-22082
Chak
2001-12-19 10:07
2002.01.08
Cómo pasar un parámetro de función a una DLL.


3-21968
Olban
2001-12-05 11:20
2002.01.08
QuantumGrid





africaans albanés Arabic armenio Azerbaiyán vasco Bielorruso Bulgarian Catalán Chino (simplificado) Chino (tradicional) Croata Checo Danés Dutch Inglés Estonia filipina Finnish French
gallego georgiano Alemán Griego criollo haitiano Hebreo hindi Húngaro islandés Indonesian irlandés Italiano Japonés Korean letón lituano macedonio Malay maltés Noruego
persa polaco Portuguese Rumano Ruso Serbio Slovak Esloveno Español swahili Sueco Thai turco ucranio Urdu vietnamita galés yídish bengalí bosnio
cebuano esperanto gujarati hausa hmong igbo javanés kannada khmer lao latín maorí marathi mongol nepali punjabi somalí Tamil telugu yoruba
zulú
Английский Francés Alemán Italiano portugués Русский Español