やっとMozillaのコード読めるようになってきたよ
しかし、なんか、今月号のCマガに全部書いてあった説。あと二日早く気付いてればなぁ…
まあ…まあいいや。
#include <stdio.h> #include <nsIServiceManager.h> #include <nsXPCOM.h> #include <nsIBaseWindow.h> #include <nsIAppShell.h> #include <nsWidgetsCID.h> #include <nsIWidget.h> #include <nsRect.h> #include <nsGUIEvent.h> #include <gtk/gtk.h> #include <nsIRenderingContext.h> #include <nsFont.h> #include <nsGfxCIID.h> #include <nsIFontMetrics.h> #include <nsIErrorService.h> static NS_DEFINE_CID(kAppShellCID, NS_APPSHELL_CID); static NS_DEFINE_CID(kFontMetricsCID, NS_FONT_METRICS_CID); static NS_DEFINE_CID(kWindowCID, NS_WINDOW_CID); static NS_DEFINE_CID(kLabelCID, NS_LABEL_CID ); static NS_DEFINE_CID(kESCID, NS_ERRORSERVICE_CID); static nsEventStatus PR_CALLBACK event_callback( nsGUIEvent *ev ) { switch ( ev->message ) { case NS_XUL_CLOSE: ev->widget->GetAppShell()->Exit(); return nsEventStatus_eConsumeNoDefault; case NS_PAINT: { nsIRenderingContext *rc = ((nsPaintEvent*)ev)->renderingContext; nsRect *r = ((nsPaintEvent*)ev)->rect; rc->SetColor( NS_RGB(0,0,0) ); rc->FillRect( *r ); rc->SetColor( NS_RGB(0xff,0xff,0xff) ); rc->DrawLine( 0, 0, 100, 100 ); /*rc->DrawString( "Hello", 5, 100, 100 );*/ return nsEventStatus_eConsumeNoDefault; } } return nsEventStatus_eIgnore; } int main( int argc, char **argv ) { nsresult rv; gtk_set_locale(); gtk_init(&argc, &argv); gtk_widget_set_default_visual(gdk_rgb_get_visual()); gtk_widget_set_default_colormap(gdk_rgb_get_cmap()); rv = NS_InitXPCOM2(nsnull, nsnull, nsnull); if ( NS_FAILED(rv) ) { printf("Calling NS_InitXPCOM returns [%x].\n", rv); return -1; } { nsresult rv; nsWidgetInitData init; nsCOMPtr<nsIAppShell> appShell; nsCOMPtr<nsIWidget> window; nsCOMPtr<nsIWidget> label; appShell = do_CreateInstance( kAppShellCID ); nsRect r( 0, 0, 100, 100 ); init.mWindowType = eWindowType_toplevel; if ( !appShell ) { NS_WARNING( "Failed to create appshell" ); return 1; } rv = appShell->Create( &argc, argv ); if ( NS_FAILED(rv) ) { NS_WARNING( "Failed to create appshell" ); return 1; } rv = appShell->Spinup(); if ( NS_FAILED(rv) ) { NS_WARNING( "Failed to create appshell" ); return 1; } window = do_CreateInstance( kWindowCID, &rv ); window->Create( (nsIWidget*)nsnull, r, event_callback, nsnull, appShell, nsnull,&init ); window->Show( PR_TRUE ); window->Move( 0, 0 ); window->Resize( 640, 480, true ); appShell->Run(); } NS_ShutdownXPCOM(nsnull); return 0; }
大体こんな感じにすれば、ただの生ウィンドウにRenderingContext(多分GraphicsContextのこと)使ってなんか色々できるはず。
初期化部分がちょい環境依存。これは多分仕方ない。
というわけでブラウザを作ろう編に続く、かもしれない。やる気が出れば。
そして、長いコードを貼り付けるのはあんまりよくない。けど、これが一番楽なんだよな…