ivantu |
Отправлено: 22 Августа, 2019 - 07:45:33
|
Эксперт
Покинул форум
Сообщений всего: 732
Дата рег-ции: Нояб. 2013
Репутация: 14
|
Или может есть какая то подложка внутри которой можно разместить контролы, и если скрывать подложку все контролы на ней так же скроются.
(Добавление)
Смысл сделать что то типо вкладок, вот нашел рабочий вариант на C++, может знающие люди помогут оптимизировать его для Кибор
Исходник (Отобразить)
CODE:#include <windows.h>
#include <commctrl.h>
#include <tchar.h>
#include <iostream>
//#pragma comment(lib, "Comctl32.lib")
BOOL RegClass(WNDPROC, LPCTSTR, UINT);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE hInstance;
char szClassName[] = "Class";
char szTitle[] = "¬кладки";
int __stdcall _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
//InitCommonControls();
MSG msg;
HWND hwnd;
hInstance = hInstance;
if (!RegClass(WndProc, szClassName, COLOR_WINDOW))
return FALSE;
if (!(hwnd = CreateWindow(szClassName,
szTitle,
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
100,
50,
640,
480,
0,
0,
hInstance,
NULL)))
return FALSE;
while (GetMessage(&msg, 0, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
BOOL RegClass(WNDPROC Proc, LPCTSTR szName, UINT brBackground)
{
WNDCLASS wc;
wc.style = wc.cbClsExtra = wc.cbWndExtra = 0;
wc.lpfnWndProc = Proc;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(brBackground + 1);
wc.lpszMenuName = (LPCTSTR)NULL;
wc.lpszClassName = szName;
return (RegisterClass(&wc) != 0);
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
int wmId;
TC_ITEM tabitem;
//static HWND d;
static HWND tab[3][3] = { 0 };
static HWND hButton1, hButton2, hTControl1, hTControl2;
switch (msg)
{
case WM_CREATE:
{
hTControl1 = CreateWindow(WC_TABCONTROL, NULL, WS_CHILD | WS_VISIBLE, 0, 0, 240, 268, hwnd, NULL, hInstance, NULL);
tabitem.mask = TCIF_TEXT;
tabitem.iImage = 0;
tabitem.pszText = "1st tab";
SendMessage(hTControl1, TCM_INSERTITEM, 1, LPARAM(&tabitem));
tabitem.pszText = "2nd tab";
tabitem.iImage = 1;
SendMessage(hTControl1, TCM_INSERTITEM, 1, LPARAM(&tabitem));
tabitem.pszText = "3d tab";
tabitem.iImage = 2;
SendMessage(hTControl1, TCM_INSERTITEM, 1, LPARAM(&tabitem));
tab[0][0] = CreateWindow("button", "kn1", WS_CHILD | WS_VISIBLE, 30, 30, 40, 68, hTControl1, NULL, hInstance, NULL);
tab[2][1] = CreateWindowEx(0, "EDIT", "Hello1", WS_CHILD | WS_VISIBLE, 100, 100, 50, 50, hwnd, NULL, hInstance, NULL);
//tab[1][1] = CreateWindowEx(0, "EDIT", "Hello2", WS_CHILD | WS_VISIBLE, 100, 150, 50, 50, hwnd, NULL, hInstance, NULL);
tab[1][0] = CreateWindow("button", "kn2", WS_CHILD, 30, 30, 40, 68, hTControl1, NULL, hInstance, NULL);
tab[2][0] = CreateWindow("button", "kn3", WS_CHILD, 30, 30, 40, 68, hTControl1, NULL, hInstance, NULL);
return 0;
}
case WM_NOTIFY:
if (((LPNMHDR)lParam)->code == TCN_SELCHANGE)
{
wmId = SendMessage(hTControl1, TCM_GETCURSEL, 0, 0);
for (int j = 0; j < 3; j++)
{
for (int i = 0; i<3; i++) if (tab[i][j]) ShowWindow(tab[i][j], SW_HIDE);
ShowWindow(tab[wmId][j], SW_SHOW);
}
}
break;
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
}
}
return DefWindowProc(hwnd, msg, wParam, lParam);
} (Отредактировано автором: 22 Августа, 2019 - 07:46:23) |
|
|
Nikanr |
Отправлено: 22 Августа, 2019 - 13:55:15
|
Специалист
Покинул форум
Сообщений всего: 231
Дата рег-ции: Март 2019
Репутация: 5
|
Может это подойдет? Если я конечно правильно понял что требуется
CODE:external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );
external(INT, "SendMessage", "SendMessageA", "User32.dll" );
int dil; //контроль диалогов
int baton1, baton2, baton3, baton4;
createdialog(0);
showdialog(0, "Диалог", 835, 390, 250, 300, 1, 1);
loop() pause(100);
function getmessage(0, WM_CREATE){
baton1=CreateWindow(0, "BUTTON", "Контролы диалога 1",768+8192+1342177280, 12, 100, 100, 40, gethwnd(0), 0, 0, 0);
baton2=CreateWindow(0, "BUTTON", "Контролы диалога 2",768+8192+1342177280, 12, 150, 100, 40, gethwnd(0), 0, 0, 0);
}
function getmessage(0, WM_COMMAND){
if (message.lparam==baton1){
dil=1;//диалог создан
createdialog(1);
showdialog(1, "Диалог", 835, 390, 250, 300, 4, 1);
}
if (message.lparam==baton2){
dil=2;
createdialog(1);
showdialog(1, "Диалог", 835, 390, 250, 300, 4, 1);
}
}
function getmessage(1, WM_CREATE){
if(dil==1){
baton3=CreateWindow(0, "BUTTON", "галка", 3+1342177280, 10, 112, 166, 20, gethwnd(1), 0, 0, 0);
}
}
function getmessage(1, WM_CLOSE){
dil=0;
destroydialog(1);
}
Еще можно добавить WM_LBUTTONDOWN и WM_LBUTTONUP и флаг, что бы галка оставалась визуально активной если диалог закрыть и открыть заново |
|
|
007wan |
Отправлено: 22 Августа, 2019 - 14:04:31
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
Или это:
Код (Отобразить)CODE:#define MNS_NOTIFYBYPOS 134217728
#define MIM_STYLE 16
#define MF_POPUP 16
external(INT, "CreateMenu", "CreateMenu", "User32.dll" );
external(INT, "CreatePopupMenu", "CreatePopupMenu", "User32.dll" );
external(INT, "AppendMenu", "AppendMenuA", "User32.dll" );
external(INT, "SetMenuInfo", "SetMenuInfo", "User32.dll" );
external(INT, "SetMenu", "SetMenu", "User32.dll" );
external(INT, "CreateWindow", "CreateWindowExA", "User32.dll" );
int MENUINFO[7]={28, MIM_STYLE, 0, 0, 0, 0, 0};
int HMENU;
HMENU=CreateMenu();
AppendMenu(HMENU, MF_POPUP, 1, "Настройки" );
createdialog(0);
createdialog(1);
showdialog(0, "Диалог",100, 100, 300, 300, 1, 1);
loop()sleep(1);
function getmessage(0, WM_CREATE)
{
SetMenuInfo(HMENU, address(#MENUINFO[0]));
SetMenu(gethwnd(0), HMENU);
}
function getmessage(0, WM_COMMAND)
{
if(loword(message.wparam) == 1)
{
showdialog(1, "Диалог2",500, 100, 200, 200, 0, 1);
}
}
(Добавление)
Да даже тот код, который я выложил можно сделать, что бы 2 диалог был на диалоге, просто координаты удерживать и всё и диалог никуда не уйдет с диалога |
|
|
|