To usm78-gis
Ответ на:
Дело в том, что я не знаю совсем *.rc в Win32/WinCE.
так уж получилось, что освоил только “рукопашный” вариант создания окошек-кнопочек.
Вот и перейдя в Линукс, использую библиотеки GTK, но окна-кнопочки рисую “врукопашную”.
Примерно так в Win - main_windows.c:
#include "main.h" // UNCOMMENT THIS IF YOU USE THIS HEADER.
// main function.
int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinst, LPTSTR cmdline, int show)
{
instance = hinstance;
////InitCommonControls(); // КАК ВЫЯСНИЛОСЬ, ЭТА ИНИЦИАЛИЗАЦИЯ НЕ НУЖНА!!!
register_classes();
// Manually added:
strcpy(lf.lfFaceName, TEXT("Tahoma"));
lf.lfHeight = -11;
lf.lfWeight = FW_BOLD;
lf.lfQuality = DEFAULT_QUALITY;
h_font = CreateFontIndirect(&lf);
strcpy(lf.lfFaceName, TEXT("MS Sans Serif"));
h_font2 = CreateFontIndirect(&lf); // Manually added !!!
/*
h_font = CreateFontIndirect(-12, 0, 0, 0, FW_BOLD, 0, // FW_NORMAL
0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "ARIAL"); //"Times New Roman"
// Manually added:
h_font2 = CreateFontIndirect(-10, 0, 0, 0, FW_BOLD, 0, //-13, 0, 0, 0, FW_NORMAL, 0,
0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "MS Sans Serif"); //"Times New Roman");
*/
create_wnd0();
create_wnd1();
create_wnd2();
create_wnd3();
create_wnd4();
create_wnd5();
create_wnd6();
// Manually added:
// скрыть все созданные окна, кроме первого (ГЛАВНОГО)
ShowWindow(hwnd1, SW_HIDE);
//UpdateWindow(hwnd1);
ShowWindow(hwnd2, SW_HIDE);
ShowWindow(hwnd3, SW_HIDE);
ShowWindow(hwnd4, SW_HIDE);
ShowWindow(hwnd5, SW_HIDE);
ShowWindow(hwnd6, SW_HIDE);
return message_loop();
}
// LRESULT CALLBACK wnd_procXX() процедура вызова для каждого окна программы:
// window procedure #0 [GNSS_monitor]. It's MAIN-WINDOW that has 6 Command-buttons only (Menu-analog)
LRESULT CALLBACK wnd_proc0(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
// Manually added:
//ShowWindow(hwnd0, SW_HIDE); // скрыть текушее окно 0 (ГЛАВНОЕ)
//UpdateWindow(hwnd0);
switch (msg)
{
case WM_COMMAND:
switch (LOWORD(wparam))
{
case IDC_BUTTON1: // button "2_Mode"
////MessageBox(hwnd, TEXT("the button IDC_BUTTON1 is clicked."), TEXT("Event"), MB_OK|MB_ICONINFORMATION);
// Manually added:
ShowWindow(hwnd2, SW_SHOW); // открыть окно 2 МОДА
UpdateWindow(hwnd2);
break;
case IDC_BUTTON4: // button "5_Meassurement"
////MessageBox(hwnd, TEXT("the button IDC_BUTTON4 is clicked."), TEXT("Event"), MB_OK|MB_ICONINFORMATION);
// Manually added:
ShowWindow(hwnd5, SW_SHOW); // открыть окно 5 ИЗМЕРЕНИЕ
UpdateWindow(hwnd5);
break;
// LRESULT CALLBACK wnd_procXX() для каждого окна программы:
// window procedure #1 [Files].
LRESULT CALLBACK wnd_proc1(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
// ... ... ...
// и так далее ...
// create window #0 [GNSS_monitor] - здесь параметры окна
HWND create_wnd0()
{
HWND wnd;
wnd = CreateWindowEx(0x00020000, WND_CLASS_NAME0, TEXT("GNSS_monitor"), 0x14CF0000, 0, 0, 236, 299, NULL, NULL, instance, NULL);
ShowWindow(wnd, SW_SHOWNORMAL);
UpdateWindow(wnd);
// Manually added:
hwnd0 = wnd; // записать дескриптор окна
return wnd;
}
// ... ... ...
// и так далее ...
// create window content #0 [GNSS_monitor] - здесь параметры кнопочек-рюшечек окна
void create_wnd_content0(HWND parent)
{
HWND wnd;
////wnd = CreateWindowEx(0x00000000, TEXT("msctls_statusbar32"), TEXT("Current_Info"), 0x50000000, 0, 253, 230, 21, parent, (HMENU) IDC_STATUS0, instance, NULL);
hStatusBar = CreateWindowEx(0x00000000, TEXT("msctls_statusbar32"), TEXT("Current_Info"), 0x50000000, 0, 253, 230, 21, parent, (HMENU) IDC_STATUS0, instance, NULL);
SendMessage(wnd, WM_SETFONT, (WPARAM) h_font, TRUE);
wnd = CreateWindowEx(0x00000000, TEXT("Button"), TEXT("6_SKY"), 0x50012F00, 117, 179, 112, 68, parent, (HMENU) IDC_BUTTON5, instance, NULL);
SendMessage(wnd, WM_SETFONT, (WPARAM) h_font, TRUE);
wnd = CreateWindowEx(0x00000000, TEXT("Button"), TEXT("4_Surveying"), 0x50012F00, 117, 107, 112, 66, parent, (HMENU) IDC_BUTTON3, instance, NULL);
SendMessage(wnd, WM_SETFONT, (WPARAM) h_font, TRUE);
wnd = CreateWindowEx(0x00000000, TEXT("Button"), TEXT("2_Mode"), 0x50012F00, 117, 36, 111, 66, parent, (HMENU) IDC_BUTTON1, instance, NULL);
SendMessage(wnd, WM_SETFONT, (WPARAM) h_font, TRUE);
wnd = CreateWindowEx(0x00000000, TEXT("Button"), TEXT("5_Meassurement"), 0x50012F00, 0, 179, 112, 68, parent, (HMENU) IDC_BUTTON4, instance, NULL);
SendMessage(wnd, WM_SETFONT, (WPARAM) h_font, TRUE);
wnd = CreateWindowEx(0x00000000, TEXT("Button"), TEXT("3_Connect"), 0x50012F00, 0, 107, 112, 66, parent, (HMENU) IDC_BUTTON2, instance, NULL);
SendMessage(wnd, WM_SETFONT, (WPARAM) h_font, TRUE);
wnd = CreateWindowEx(0x00000000, TEXT("Button"), TEXT("1_Files"), 0x50012F00, 0, 36, 112, 66, parent, (HMENU) IDC_BUTTON0, instance, NULL);
SendMessage(wnd, WM_SETFONT, (WPARAM) h_font, TRUE);
wnd = CreateWindowEx(0x00000000, TEXT("ToolbarWindow32"), TEXT(""), 0x50000001, 0, 0, 230, 28, parent, (HMENU) IDC_TOOLBAR0, instance, NULL);
SendMessage(wnd, WM_SETFONT, (WPARAM) h_font, TRUE);
}
// ... ... ...
// и так далее ...
// а в конце main.c:
// register all the window classes.
void register_classes()
{
WNDCLASS wc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hInstance = instance;
wc.lpszMenuName = NULL;
wc.style = CS_PARENTDC | CS_DBLCLKS;
wc.lpfnWndProc = wnd_proc0;
wc.lpszClassName = WND_CLASS_NAME0;
// ... ... ...
// и так далее ...
// и главный цикл программы
// message loop.
int message_loop()
{
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
DeleteObject(h_font);
return msg.wParam;
}
/* End of file main_windows.c */
Примерно так в Lin - main.c:
/* makes the widget-dialog "Message Box", used global string strMsg for messages */
GtkWidget* msgbox (void)
{
GtkWidget *msgbox; // non-modal dialog
GtkWidget * content_area;
GtkWidget * label;
//strMsg = "Test MessageBox";
msgbox = gtk_dialog_new_with_buttons ("Message Box", NULL, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_STOCK_OK, GTK_RESPONSE_OK, NULL);
content_area = gtk_dialog_get_content_area (GTK_DIALOG (msgbox));
label = gtk_label_new (strMsg);
gtk_container_add (GTK_CONTAINER (content_area), label);
gtk_widget_show_all (msgbox);
if (gtk_dialog_run(GTK_DIALOG (msgbox)) == GTK_RESPONSE_OK)
gtk_widget_destroy (msgbox);
return msgbox;
}
/*---------------------------------------------------------------------------*/
/* creates here main window and invokes from here all addition windows */
int main (int argc, char *argv[])
{
OpenFiles=0; // set global variable - files was not opened
GtkWidget* win0;
gtk_disable_setlocale (); // to disable locale RU numbers as 123,456 insted 123.456
gtk_init (&argc, &argv);
win0 = create_window0(); // ON START OF PROGRAM CREATES ONLY FIRST WINDOW - window0
/* switch - manipulate of all windows */
gtk_main();
return 0;
}
/* а все окна с их кнопочками-рюшечками в файле inerface.c: */
#include "main.h"
/*
GtkWidget* create_window0 (void)
GtkWidget* create_window1 (void)
GtkWidget* create_window2 (void)
GtkWidget* create_window3 (void)
GtkWidget* create_window4 (void)
GtkWidget* create_aboutdialog1 (void)
*/
/* Forward declarations */
/* callback-functions joined with some widgets in CURRENT WINDOW of program */
/* Callback-functions for invoked-buttons from main window0 */
/*---------------------------------------------------------------------------*/
/* makes the window 0 "GNSS Monitor", creates here main window and invokes from here all additional windows */
GtkWidget* create_window0 (void)
//GtkWindow* create_window0( void )
{
GtkWidget *tablebox; // GtkWidget GtkTable
GtkWidget *vbox, *hbox;
//GtkWidget *checkbox1, *checkbox2; // removed to global
GtkWidget *button0, *button1, *button2, *button3, *button4, *button5, *button6;
GtkWidget * statusbar;
//GtkStatusbar * statusbar;
const gchar *title = "GNSS Monitor";
/* Standard window-creating stuff */
window0 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_position (GTK_WINDOW(window0), GTK_WIN_POS_CENTER_ALWAYS);
gtk_window_set_title (GTK_WINDOW (window0), title);
gtk_widget_set_usize(window0, 250, 200);
/* create widgets on current window */
checkbox1 = gtk_check_button_new_with_label ("BASE");
checkbox2 = gtk_check_button_new_with_label ("ROVER");
gtk_toggle_button_set_active(checkbox2, TRUE); // ROVER is active BY DEFAULT
button0 = gtk_button_new_with_label(" E X I T ");
button1 = gtk_button_new_with_label("FILES");
button2 = gtk_button_new_with_label("SETTINGS");
button3 = gtk_button_new_with_label("CONNECT");
button4 = gtk_button_new_with_label("SKY");
button5 = gtk_button_new_with_label("SURVEYING");
button6 = gtk_button_new_with_label("ABOUT");
/* create vertical-box frame on current window */
vbox = gtk_vbox_new (FALSE, 3);
gtk_container_add (GTK_CONTAINER (window0), vbox);
hbox = gtk_hbox_new (FALSE, 3);
//gtk_container_add (GTK_CONTAINER (vbox), hbox);
//gtk_container_add (GTK_CONTAINER (hbox), checkbox1);
//gtk_container_add (GTK_CONTAINER (hbox), checkbox2);
//gtk_container_add (GTK_CONTAINER (hbox), button0);
/* create statusbar widget on current window */
statusbar = gtk_statusbar_new();
gchar *string = "Info-text in statusbar";
gtk_statusbar_push (statusbar, 0, string); // widget_name, index_in_widget_string, contecst_to_insert
/* create table-box frame in vbox-frame on current window */
tablebox = gtk_table_new (4, 2, TRUE); // 4 rows x 2 colons
gtk_table_set_col_spacings(tablebox, 3);
gtk_table_set_row_spacings(tablebox, 3);
gtk_container_add (GTK_CONTAINER (vbox), tablebox);
gtk_widget_show (tablebox);
/* set 6 buttons & statusbar to table-box frame */
gtk_table_attach_defaults (tablebox, button1, 0, 1, 0, 1);
gtk_table_attach_defaults (tablebox, button2, 1, 2, 0, 1);
gtk_table_attach_defaults (tablebox, button3, 0, 1, 1, 2);
gtk_table_attach_defaults (tablebox, button4, 1, 2, 1, 2);
gtk_table_attach_defaults (tablebox, button5, 0, 1, 2, 3);
gtk_table_attach_defaults (tablebox, button6, 1, 2, 2, 3);
/* set 2 checkboxes & EXIT button to table-box frame */
gtk_table_attach_defaults (tablebox, hbox, 0, 2, 3, 4);
gtk_container_add (GTK_CONTAINER (hbox), checkbox1);
gtk_container_add (GTK_CONTAINER (hbox), checkbox2);
gtk_container_add (GTK_CONTAINER (hbox), button0);
/* statusbar to table-box frame */
gtk_table_attach_defaults (tablebox, statusbar, 0, 2, 4, 5);
/* reaction widget -> signal - invoke callback-functions */
g_signal_connect(G_OBJECT(window0), "delete_event", G_CALLBACK(delete_event), NULL);
g_signal_connect(G_OBJECT(window0), "destroy", G_CALLBACK(destroy), NULL);
/* by pressing button0 callback-func. 'destroy() call system-func gtk_main_quit() over gtk_widget_destroy() */
g_signal_connect(G_OBJECT(button0), "clicked", G_CALLBACK(button0_clicked), (gpointer)"button0");
/* by pressing button0 callback-func. button0_clicked() swap parameter with system-func. gtk_widget_destroy() */
g_signal_connect_swapped(G_OBJECT(button0), "clicked", G_CALLBACK(gtk_widget_destroy), G_OBJECT(window0));
/* reaction widget -> signal - invoke callback-functions to OPEN slave-windows */
/* It is program-menu - de'facto !!! */
/* by pressing heckbox callback-func. on_button_checkbox_clicked ("BASE" "ROVER") */
g_signal_connect(G_OBJECT(checkbox1), "clicked", G_CALLBACK(on_button_checkbox_clicked), (gpointer)"checkbox1");
g_signal_connect(G_OBJECT(checkbox2), "clicked", G_CALLBACK(on_button_checkbox_clicked), (gpointer)"checkbox2");
g_signal_connect (G_OBJECT(button1), "clicked", G_CALLBACK (on_button1_clicked), NULL);
g_signal_connect (G_OBJECT(button2), "clicked", G_CALLBACK (on_button2_clicked), NULL);
g_signal_connect (G_OBJECT(button3), "clicked", G_CALLBACK (on_button3_clicked), NULL);
g_signal_connect (G_OBJECT(button4), "clicked", G_CALLBACK (on_button4_clicked), NULL);
g_signal_connect (G_OBJECT(button5), "clicked", G_CALLBACK (on_button5_clicked), NULL);
g_signal_connect (G_OBJECT(button6), "clicked", G_CALLBACK (on_button6_clicked), NULL);
/* now show all created widgets & window */
gtk_widget_show_all (window0);
// before view window0, view MessageBox
strMsg = " ORDER OF WORK THIS PROGRAM:\n1.FILES select folder for write files\n of new job, or select existing bin-file\n2.SETTINGS set device, port-attributes\n3.CONNECT connect to device\n4.SURVEYING describe job points/line\n5.SKY view satellities on sky & power\n signals from satellities.\n Now press OK button to continue...";
msgbox();
return window0;
}
/* end od function create_window0() */
/*---------------------------------------------------------------------------*/
Подойдет, нет?