RTKlib/постпроцессинг

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() */
/*---------------------------------------------------------------------------*/

Подойдет, нет?