📄 mgwidget.c
字号:
#include "html.h"#include "nav.h"#include "debug.h"#include "edillo.h"#include "dw_widget.h"#include "dw_viewport.h"#include "mgwidget.h"#include "dw_container.h"#include "dw_button.h"#include "dw_marshal.h"#define ADD_LENGTH 10#define APPEND_LENGTH 20#define MIN_WIDTH 40extern BrowserWindow* a_BrowserWindow_new (HWND hwnd_parent);extern void Html_submit_form(DilloHtmlLB* html_lb, DilloHtmlForm* form, DwWidget* widget);extern void Html_reset_form(HWND hwnd, int id, int nc, DWORD add_data);static void Dw_MgWidget_init (DwMgWidget *MgWidget);static void Dw_MgWidget_class_init (DwMgWidgetClass *klass);static void Dw_MgWidget_size_request (DwWidget *widget, DwRequisition *requisition);static void Dw_MgWidget_size_allocate (DwWidget *widget, DwAllocation *allocation);static void Dw_MgWidget_finalize (GObject *object);static void Dw_MgWidget_draw (DwWidget *widget, HDC hdc, DwRectangle *area);static gboolean Dw_MgWidget_press (DwWidget *widget, gint32 x, gint32 y, DWORD flags);static gboolean Dw_MgWidget_release (DwWidget *widget, gint32 x, gint32 y, DWORD flags);static gboolean Dw_MgWidget_press (DwWidget *widget, gint32 x, gint32 y, DWORD flags);static gboolean Dw_MgWidget_release (DwWidget *widget, gint32 x, gint32 y, DWORD flags);enum{ CLICKED, CLICKED_AT, LAST_SIGNAL};static DwContainerClass *parent_class;static guint mgwidget_signals[LAST_SIGNAL] = { 0 };void mg_notif_submit_form (HWND hwnd, int id, int nc, DWORD add_data){ int form_id, control_id; DilloHtmlLB* html_lb; DilloHtmlForm* form; DilloHtmlInput *input; if(nc != BN_CLICKED) return; form_id = HIWORD(id) - 1; control_id = LOWORD(id); html_lb = (DilloHtmlLB*)GetWindowAdditionalData (hwnd); form = &html_lb->forms[form_id]; input = &(form->inputs[control_id]); Html_submit_form (html_lb, form, input->widget);}/* * Return the type of DwButton */GType a_Dw_MgWidget_get_type (void){ static GType type = 0; if (!type) { static const GTypeInfo info = { sizeof (DwMgWidgetClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) Dw_MgWidget_class_init, (GClassFinalizeFunc) NULL, (gconstpointer) NULL, sizeof (DwMgWidget), 0, (GInstanceInitFunc) Dw_MgWidget_init }; type = g_type_register_static (DW_TYPE_WIDGET, "DwMgWidget", &info, 0); } return type;}/* * Standard GObject function. */static void Dw_MgWidget_init (DwMgWidget *mgwidget){ mgwidget->window = -1; mgwidget->id = -1; mgwidget->size.cx = 0; mgwidget->size.cy = 0; mgwidget->type = -1;}/* * Standard GObject function. */static void Dw_MgWidget_class_init (DwMgWidgetClass *klass){ GObjectClass *object_class; DwWidgetClass *widget_class; object_class = G_OBJECT_CLASS (klass); widget_class = (DwWidgetClass*) klass; parent_class = g_type_class_peek_parent (klass); mgwidget_signals[CLICKED] = g_signal_new ("clicked", G_OBJECT_CLASS_TYPE (klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (DwMgWidgetClass, clicked), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); mgwidget_signals[CLICKED_AT] = g_signal_new ("clicked_at", G_OBJECT_CLASS_TYPE (klass), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (DwMgWidgetClass, clicked_at), NULL, NULL, p_Dw_marshal_VOID__INT_INT, G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT); object_class->finalize = Dw_MgWidget_finalize; widget_class->size_request = Dw_MgWidget_size_request; widget_class->size_allocate = Dw_MgWidget_size_allocate; widget_class->draw = Dw_MgWidget_draw; widget_class->button_press_event = Dw_MgWidget_press; widget_class->button_release_event = Dw_MgWidget_release; klass->clicked = NULL; klass->clicked_at = NULL;}/* * Standard Dw function. */static void Dw_MgWidget_size_request (DwWidget *widget, DwRequisition *requisition){ DwMgWidget *mgwidget = DW_MGWIDGET (widget); if (requisition) { requisition->width = mgwidget->size.cx; requisition->ascent = mgwidget->size.cy; requisition->descent = 0; }}/* * Standard Dw function. */static void Dw_MgWidget_size_allocate (DwWidget *widget, DwAllocation *allocation){ DwMgWidget *mgwidget = DW_MGWIDGET (widget); DwViewport *viewport = widget->viewport; if (allocation->width == 0 || allocation->ascent + allocation->descent == 0) ShowWindow (mgwidget->window, SW_HIDE); else { ShowWindow (mgwidget->window, SW_SHOWNORMAL); if (allocation->x != widget->allocation.x || allocation->y != widget->allocation.y || allocation->width != widget->allocation.width || allocation->ascent + allocation->descent != DW_WIDGET_HEIGHT(widget)) { mgwidget->size.cx = allocation->width; mgwidget->size.cy = allocation->ascent + allocation->descent; MoveWindow (mgwidget->window, allocation->x - viewport->world_x, allocation->y - viewport->world_y, mgwidget->size.cx, mgwidget->size.cy, TRUE); } }}/* * Standard Dw function. */static void Dw_MgWidget_draw (DwWidget *widget, HDC hdc, DwRectangle *area){}/* * Standard Dw function. */static gboolean Dw_MgWidget_press (DwWidget *widget, gint32 x, gint32 y, DWORD flags){ return FALSE;}/* * Standard Dw function. */static gboolean Dw_MgWidget_release (DwWidget *widget, gint32 x, gint32 y, DWORD flags){ return FALSE;}static void Dw_MgWidget_finalize (GObject* object){ DwMgWidget *mgwidget = DW_MGWIDGET (object); if (mgwidget->window != -1) DestroyWindow (mgwidget->window); G_OBJECT_CLASS(parent_class)->finalize (object);}static void Dw_MgWidget_get_text_metrics (const char* title, int nr_chars, int* width, int* height){ PLOGFONT logfont; SIZE size; logfont = GetSystemFont(SYSLOGFONT_CONTROL); SelectFont (HDC_SCREEN, logfont); GetTextExtent (HDC_SCREEN, title, nr_chars, &size); if (width) *width = size.cx; if (height) *height = size.cy;}static void Dw_MgWidget_set_color (HWND hwnd, DilloHtml* html){ int r, g, b; r = GetRValue(html->stack[html->stack_top].current_bg_color); g = GetGValue(html->stack[html->stack_top].current_bg_color); b = GetBValue(html->stack[html->stack_top].current_bg_color); SetWindowBkColor(hwnd, RGB2Pixel(HDC_SCREEN, r, g, b));}static DwWidget* button_real_new (DilloHtml* html, int id, const char* title, DWORD add_data, DWORD dwstyle){ DwMgWidget *mgwidget; mgwidget = DW_MGWIDGET (g_object_new (DW_TYPE_MGWIDGET, NULL)); Dw_MgWidget_get_text_metrics (title, strlen(title), &mgwidget->size.cx, &mgwidget->size.cy); mgwidget->size.cx += APPEND_LENGTH; mgwidget->window = CreateWindowEx (CTRL_BUTTON, title, dwstyle,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -