|
|
1.1 root 1: //
2: // X680x0 CGROM ビューア
3: //
4: // Copyright (C) 2012-2019 [email protected]
5: //
6:
1.1.1.3 root 7: #include "wxheader.h"
1.1 root 8: #include <wx/aboutdlg.h>
9: #include <wx/cmdline.h>
10: #include <wx/file.h>
11: #include <wx/image.h>
12: #include <wx/statline.h>
1.1.1.6 ! root 13: #include <string>
1.1 root 14:
1.1.1.2 root 15: #define TITLE wxT("X680x0 CGROMビューア")
16: #define COPYRIGHT wxT("Copyright (C) 2012-2019 [email protected]")
1.1 root 17:
18: /* CGROM.DAT の大きさ(バイト単位) */
19: #define CGROM_SIZE (768 * 1024)
20:
21: /* キャンバス全体の大きさ (ピクセル単位) */
22: #define VIEW_WIDTH (25 * 16)
23: #define VIEW_HEIGHT (25 * 16)
24:
25: /* 文字境界線の色 (これを3バイト並べる) */
26: #define BORDER_COLOR (0xaa)
27:
28: #define countof(x) (sizeof(x) / sizeof(x[0]))
29:
30: #define ROUND(x, y) (((x) + (y - 1)) / (y))
31: #define ROUND8(x) ROUND(x, 8)
32:
33: class MyFrame;
34:
35: struct ctxmenu_t {
36: int id;
37: int addr;
1.1.1.2 root 38: wxString label;
1.1 root 39: int size;
40: };
41:
42: const wxSize view(VIEW_WIDTH, VIEW_HEIGHT);
43:
44: class ViewCtrl : public wxWindow
45: {
46: typedef wxWindow inherited;
47: public:
48: ViewCtrl(wxWindow *parent);
49:
50: unsigned char *imagebuf;
51: private:
52: void OnPaint(wxPaintEvent& event);
1.1.1.5 root 53: wxDECLARE_EVENT_TABLE();
1.1 root 54: };
55:
56: class MyFrame : public wxFrame
57: {
58: typedef wxFrame inherited;
59: public:
60: MyFrame();
61:
62: private:
1.1.1.3 root 63: void OnWindowCreate(wxWindowCreateEvent& event);
1.1 root 64: void OnOpen(wxCommandEvent& event);
65: void DoOpenDialog();
66: void DoOpen();
67: void OnExit(wxCommandEvent& event);
68: void OnAbout(wxCommandEvent& event);
69: void OnContextMenu(wxContextMenuEvent& event);
70: void OnReloadUI(wxUpdateUIEvent& event);
71: void OnReload(wxCommandEvent& event);
72: bool DoReload();
73: void OnAddr(wxCommandEvent& event);
74: void OnMouseWheel(wxMouseEvent& event);
75: void OnScroll(wxScrollEvent& event);
76: void OnTextEnter(wxCommandEvent& event);
77: void OnSizeBox(wxCommandEvent& event);
78: void DoUpdateSize();
79: void DoUpdateAddr();
80: bool CreateImage();
81:
82: ViewCtrl *viewctrl;
83: wxScrollBar *scrlbar;
84: wxTextCtrl *addrctrl;
85: wxChoice *sizectrl;
86: wxMenu *menu;
87: wxString filename;
88: wxFile file;
89: int start_addr; /* 現在のサイズのフォントの開始アドレス */
90: int start_offset; /* 現在のサイズのフォントの開始オフセット */
91: int start_line; /* 現在のサイズのフォントの開始行 */
92: int total_line; /* 現在のサイズのフォントでの行数 */
93: int line; /* 表示開始行 */
94: int addr; /* 表示開始アドレス */
95: int size; /* フォントサイズ (番号) */
96: wxSize pxsz; /* フォントサイズ (ピクセル数) */
97: wxSize bdsz; /* 境界線を含めた大きさ (ピクセル数) */
98: wxSize num; /* 1画面の文字数 */
99: wxSize oct; /* 1文字のバイト数(縦,横) */
100: int bytes; /* 1文字のバイト数 */
101: int w_bytes; /* 1行分のバイト数(スクロールバー用) */
102:
103: static ctxmenu_t ctxmenu[];
104:
1.1.1.5 root 105: wxDECLARE_EVENT_TABLE();
1.1 root 106: };
107:
108: class MyApp : public wxApp
109: {
110: public:
111: virtual bool OnInit();
112: wxString filename;
113:
114: private:
115: MyFrame *frame;
116: static const wxCmdLineEntryDesc desc[];
117: };
118:
119: IMPLEMENT_APP(MyApp)
120:
121: // ---
122:
123: enum {
124: ID_SCROLL,
125: ID_ADDRBOX,
126: ID_SIZEBOX,
127: ID_RELOAD,
128: ID_FONT_BEGIN,
129: ID_FONT_16x16 = ID_FONT_BEGIN,
130: ID_FONT_8x8,
131: ID_FONT_8x16,
132: ID_FONT_12x12,
133: ID_FONT_12x24,
134: ID_FONT_24x24,
135: ID_FONT_6x12,
136: ID_FONT_END,
137: };
138:
139: enum {
140: SIZE_8x8 = 0,
141: SIZE_8x16,
142: SIZE_12x12,
143: SIZE_12x24,
144: SIZE_16x16,
145: SIZE_24x24,
146: SIZE_6x12,
147: SIZE_MAXxMAX,
148: };
149:
150: const wxCmdLineEntryDesc MyApp::desc[] =
151: {
152: { wxCMD_LINE_PARAM, NULL, NULL, "<path of CGROM.DAT>",
153: wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL, },
154: { wxCMD_LINE_NONE, },
155: };
156:
157: bool MyApp::OnInit()
158: {
159: wxCmdLineParser cmd(argc, argv);
160: cmd.SetDesc(desc);
161: if (cmd.Parse() != 0) {
162: return false;
163: }
164: if (cmd.GetParamCount() > 0) {
165: filename = cmd.GetParam(0);
166: }
167:
168: frame = new MyFrame();
169: frame->Show();
170: SetTopWindow(frame);
171: return true;
172: }
173:
174: // イベントテーブル
1.1.1.4 root 175: wxBEGIN_EVENT_TABLE(MyFrame, inherited)
1.1 root 176: EVT_CONTEXT_MENU(MyFrame::OnContextMenu)
177: EVT_MENU(ID_RELOAD, MyFrame::OnReload)
178: EVT_UPDATE_UI(ID_RELOAD, MyFrame::OnReloadUI)
179: EVT_COMMAND_SCROLL(ID_SCROLL, MyFrame::OnScroll)
180: EVT_MOUSEWHEEL(MyFrame::OnMouseWheel)
181: EVT_TEXT_ENTER(ID_ADDRBOX, MyFrame::OnTextEnter)
182: EVT_CHOICE(ID_SIZEBOX, MyFrame::OnSizeBox)
183: EVT_BUTTON(ID_FONT_16x16, MyFrame::OnAddr)
184: EVT_BUTTON(ID_FONT_8x8, MyFrame::OnAddr)
185: EVT_BUTTON(ID_FONT_8x16, MyFrame::OnAddr)
186: EVT_BUTTON(ID_FONT_12x12, MyFrame::OnAddr)
187: EVT_BUTTON(ID_FONT_12x24, MyFrame::OnAddr)
188: EVT_BUTTON(ID_FONT_24x24, MyFrame::OnAddr)
189: EVT_BUTTON(ID_FONT_6x12, MyFrame::OnAddr)
190: EVT_MENU(wxID_OPEN, MyFrame::OnOpen)
191: EVT_MENU(wxID_EXIT, MyFrame::OnExit)
192: EVT_MENU(wxID_ABOUT, MyFrame::OnAbout)
1.1.1.3 root 193: EVT_WINDOW_CREATE(MyFrame::OnWindowCreate)
1.1.1.4 root 194: wxEND_EVENT_TABLE()
1.1 root 195:
196: // ショートカット用データ
197: struct ctxmenu_t MyFrame::ctxmenu[] = {
1.1.1.2 root 198: { ID_FONT_16x16, 0x00000, wxT("16x16フォント"), SIZE_16x16, },
199: { ID_FONT_8x8, 0x3a000, wxT("8x8フォント"), SIZE_8x8, },
200: { ID_FONT_8x16, 0x3a800, wxT("8x16フォント"), SIZE_8x16, },
201: { ID_FONT_12x12, 0x3b800, wxT("12x12フォント"), SIZE_12x12, },
202: { ID_FONT_12x24, 0x3d000, wxT("12x24フォント"), SIZE_12x24, },
203: { ID_FONT_24x24, 0x40000, wxT("24x24フォント"), SIZE_24x24, },
204: { ID_FONT_6x12, 0xbf400, wxT("6x12フォント"), SIZE_6x12, },
1.1 root 205: };
206:
207: // コンストラクタ
208: MyFrame::MyFrame()
209: : inherited(NULL, wxID_ANY, TITLE)
210: {
211: wxMenuBar *menubar = new wxMenuBar();
212: wxMenu *menuFile = new wxMenu();
213: menuFile->Append(wxID_OPEN, wxT("開く(&O)"));
214: menuFile->Append(wxID_EXIT, wxT("終了(&Q)"));
215: #if defined(__WXMAC__)
216: /*
217: * Macでは wxID_ABOUT は自動的にリンゴメニューのほうに移され、
218: * 「ヘルプ」が子要素なしのメニューとして出来てしまう。
219: * それを防ぐため Mac では「ヘルプ」メニューごとなくす。
220: */
221: menuFile->Append(wxID_ABOUT, wxT("バージョン(&A)"));
222: #endif
223: menubar->Append(menuFile, wxT("ファイル(&F)"));
224: #if !defined(__WXMAC__)
225: /* Mac以外なら「ヘルプ > バージョン」メニューを作成 */
226: wxMenu *menuHelp = new wxMenu();
227: menuHelp->Append(wxID_ABOUT, wxT("バージョン(&A)"));
228: menubar->Append(menuHelp, wxT("ヘルプ(&H)"));
229: #endif
230: SetMenuBar(menubar);
231:
232: wxPanel *panel = new wxPanel(this, wxID_ANY);
233:
234: wxBoxSizer *hbox = new wxBoxSizer(wxHORIZONTAL);
235:
236: /* ビュー */
237: viewctrl = new ViewCtrl(panel);
238: hbox->Add(viewctrl);
239:
240: /* スクロールバー */
241: scrlbar = new wxScrollBar(panel, ID_SCROLL,
242: wxDefaultPosition, wxDefaultSize, wxSB_VERTICAL);
243: hbox->Add(scrlbar, 0, wxEXPAND);
244:
245: hbox->AddSpacer(5);
246:
247: /* コントロールパネル */
248: wxBoxSizer *ctrlbox = new wxBoxSizer(wxVERTICAL);
249: hbox->Add(ctrlbox);
250:
251: /* 開始アドレス */
252: ctrlbox->Add(new wxStaticText(panel, wxID_ANY, wxT("開始アドレス")));
253:
254: /* 開始アドレス(コントロール) */
1.1.1.2 root 255: addrctrl = new wxTextCtrl(panel, ID_ADDRBOX, wxT(""),
1.1 root 256: wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER);
257: ctrlbox->Add(addrctrl);
258:
259: ctrlbox->AddSpacer(5);
260:
261: /* フォントサイズ */
1.1.1.2 root 262: ctrlbox->Add(new wxStaticText(panel, wxID_ANY, wxT("フォントサイズ")));
1.1 root 263:
264: /* フォントサイズ(コントロール) */
265: wxString sizelist[] = {
1.1.1.2 root 266: wxT("8x8"),
267: wxT("8x16"),
268: wxT("12x12"),
269: wxT("12x24"),
270: wxT("16x16"),
271: wxT("24x24"),
272: wxT("6x12"),
1.1 root 273: };
274: sizectrl = new wxChoice(panel, ID_SIZEBOX,
275: wxDefaultPosition, wxDefaultSize,
276: countof(sizelist), sizelist);
277: ctrlbox->Add(sizectrl);
278:
279: ctrlbox->AddSpacer(10);
280: ctrlbox->Add(new wxStaticLine(panel), 0, wxEXPAND);
281: ctrlbox->AddSpacer(10);
282:
283: /* ショートカットボタン */
284: for (int i = 0; i < countof(ctxmenu); i++) {
285: ctxmenu_t *c = &ctxmenu[i];
286: wxString label;
287:
1.1.1.2 root 288: label.Printf(wxT("%05X: "), c->addr);
1.1 root 289: label += c->label;
290: wxButton *btn = new wxButton(panel, c->id, label,
291: wxDefaultPosition, wxDefaultSize, wxBU_LEFT);
292: ctrlbox->Add(btn, 0, wxEXPAND);
293: }
294:
295: ctrlbox->AddSpacer(5);
296: ctrlbox->Add(new wxStaticText(panel, wxID_ANY,
1.1.1.2 root 297: wxT("(6x12 フォントは\nX68030 のみ)")));
1.1 root 298:
299: panel->SetSizer(hbox);
300: hbox->SetSizeHints(this);
301:
302: /* コンテキストメニュー */
303: menu = new wxMenu();
1.1.1.2 root 304: menu->Append(ID_RELOAD, wxT("リロード"));
1.1 root 305:
306: /* 固定地 */
307: num.x = 16;
308:
309: /* 初期値を入れて更新 */
310: size = SIZE_16x16;
311: DoUpdateSize();
312:
313: addr = 0;
314: line = -1;
315: DoUpdateAddr();
316:
1.1.1.3 root 317: Connect(wxEVT_CREATE,
318: wxWindowCreateEventHandler(MyFrame::OnWindowCreate), NULL, this);
1.1 root 319: }
320:
1.1.1.3 root 321: // ウィンドウ作成イベント
1.1 root 322: void
1.1.1.3 root 323: MyFrame::OnWindowCreate(wxWindowCreateEvent& event)
1.1 root 324: {
325: if (!::wxGetApp().filename.IsEmpty()) {
326: /* 引数でファイルが指定されていればそれを使う */
327: filename = ::wxGetApp().filename;
328:
329: /* ファイルオープン */
330: DoOpen();
331: }
1.1.1.3 root 332:
333: // 一度処理したら抜いておく (こうしないと複数回呼ばれる)
334: Disconnect(wxEVT_CREATE,
335: wxWindowCreateEventHandler(MyFrame::OnWindowCreate));
1.1 root 336: }
337:
338: // オープン
339: void
340: MyFrame::OnOpen(wxCommandEvent& event)
341: {
342: DoOpenDialog();
343: DoOpen();
344: }
345:
346: // ファイルを開くダイアログ
347: void
348: MyFrame::DoOpenDialog()
349: {
1.1.1.2 root 350: wxFileDialog dialog(this, wxT("Select a file"),
1.1 root 351: ::wxGetCwd(), wxEmptyString,
1.1.1.2 root 352: wxT("DAT files (*.DAT)|*.DAT;*.dat|すべてのファイル (*.*)|*.*"));
1.1 root 353:
354: if (dialog.ShowModal() != wxID_OK) {
355: return;
356: }
357:
358: filename = dialog.GetPath();
359: }
360:
361: // オープン処理
362: void
363: MyFrame::DoOpen()
364: {
365: /* すでにオープンしてあればそれは閉じる */
366: if (file.IsOpened()) {
367: file.Close();
368: }
369:
370: /* ファイル名がなければ (タイトルを戻して) 帰る */
371: if (filename.IsEmpty()) {
372: SetTitle(TITLE);
373: return;
374: }
375:
376: if (!file.Open(filename, wxFile::read)) {
377: Close();
378: return;
379: }
380:
381: /* オープンできたのでタイトルを変更 */
382: wxString title;
383: title = TITLE;
1.1.1.2 root 384: title += wxT(" - ");
1.1 root 385: title += filename;
386: SetTitle(title);
387:
388: CreateImage();
389: }
390:
391: // 終了
392: void
393: MyFrame::OnExit(wxCommandEvent& event)
394: {
395: Close();
396: }
397:
398: // ヘルプ
399: void
400: MyFrame::OnAbout(wxCommandEvent& event)
401: {
402: wxAboutDialogInfo ab;
403:
1.1.1.2 root 404: ab.SetName(wxT("viewcgrom"));
405: ab.SetVersion(wxT("1.1"));
1.1 root 406: ab.SetDescription(TITLE);
407: ab.SetCopyright(COPYRIGHT);
408:
409: wxAboutBox(ab);
410: }
411:
412: // コンテキストメニュー
413: void
414: MyFrame::OnContextMenu(wxContextMenuEvent& event)
415: {
416: PopupMenu(menu);
417: }
418:
419: // リロード UI
420: void
421: MyFrame::OnReloadUI(wxUpdateUIEvent& event)
422: {
423: event.Enable(file.IsOpened());
424: }
425:
426: // リロードイベント
427: void
428: MyFrame::OnReload(wxCommandEvent& event)
429: {
430: DoReload();
431: }
432:
433: // リロード処理
434: bool
435: MyFrame::DoReload()
436: {
437: if (file.IsOpened()) {
438: file.Close();
439: }
440:
441: if (!file.Open(filename, wxFile::read)) {
442: return false;
443: }
444:
445: CreateImage();
446: return true;
447: }
448:
449: // フォント帯変更
450: void
451: MyFrame::OnAddr(wxCommandEvent& event)
452: {
453: ctxmenu_t *c;
454: for (int i = 0; i < countof(ctxmenu); i++) {
455: c = &ctxmenu[i];
456: if (event.GetId() == c->id) {
457: /* 一致したら変更 */
458: size = c->size;
459: DoUpdateSize();
460:
461: addr = c->addr;
462: line = -1;
463: DoUpdateAddr();
464: return;
465: }
466: }
467: }
468:
469: // マウスホイール
470: void
471: MyFrame::OnMouseWheel(wxMouseEvent& event)
472: {
473: if (event.GetWheelRotation() < 0) {
474: line += 4;
475: if (line > total_line - num.y) {
476: line = total_line - num.y;
477: }
478: } else {
479: line -= 4;
480: if (line < 0) {
481: line = 0;
482: }
483: }
484: DoUpdateAddr();
485: }
486:
487: // スクロール
488: void
489: MyFrame::OnScroll(wxScrollEvent& event)
490: {
491: line = event.GetPosition();
492: DoUpdateAddr();
493: }
494:
495: // アドレス変更
496: void
497: MyFrame::OnTextEnter(wxCommandEvent& event)
498: {
499: long val = 0;
500:
501: event.GetString().ToLong(&val, 16);
502: line = -1;
503: addr = val;
504: DoUpdateAddr();
505: }
506:
507: // サイズ変更
508: void
509: MyFrame::OnSizeBox(wxCommandEvent& event)
510: {
511: size = event.GetSelection();
512: DoUpdateSize();
513: DoUpdateAddr();
514: }
515:
516: // サイズ変更 (アドレス変更も呼び出す)
517: void
518: MyFrame::DoUpdateSize()
519: {
520: /* 範囲チェック */
521: if (size < 0 || size >= SIZE_MAXxMAX) {
522: size = SIZE_16x16;
523: }
524:
525: /* コントロールを更新 */
526: sizectrl->SetSelection(size);
527:
528: /*
529: * サイズに付随する変数を更新
530: */
531: /* ピクセルサイズ、開始アドレス、開始オフセット */
532: start_offset = 0;
533: switch (size) {
534: case SIZE_6x12:
535: pxsz = wxSize(6, 12);
536: break;
537: case SIZE_8x8:
538: pxsz = wxSize(8, 8);
539: start_addr = 0x3a000;
540: break;
541: case SIZE_8x16:
542: pxsz = wxSize(8, 16);
543: start_addr = 0x3a800;
544: break;
545: case SIZE_12x12:
546: pxsz = wxSize(12, 12);
547: start_addr = 0x3b800;
548: start_offset = 128;
549: break;
550: case SIZE_12x24:
551: pxsz = wxSize(12, 24);
552: start_addr = 0x3d000;
553: start_offset = 512;
554: break;
555: case SIZE_16x16:
556: pxsz = wxSize(16, 16);
557: start_addr = 0;
558: break;
559: case SIZE_24x24:
560: pxsz = wxSize(24, 24);
561: start_addr = 0x40000;
562: start_offset = 512;
563: break;
564: }
565:
566: /* バイト数 */
567: oct.x = (pxsz.x + 7) / 8;
568: oct.y = pxsz.y;
569: bytes = oct.x * oct.y;
570: w_bytes = bytes * num.x;
571:
572: /* 境界線入りサイズ */
573: bdsz.x = (oct.x * 8) + 1;
574: bdsz.y = oct.y + 1;
575:
576: /* 縦文字数(1画面の行数)は計算 */
577: num.y = view.y / bdsz.y;
578:
579: /* 負側の行数(端数行も含めるため round up) */
580: /* これが基準行 */
581: start_line = ROUND(start_addr, w_bytes);
582: /* 正側の行数(端数行も含めるため round up) */
583: int pline = ROUND(CGROM_SIZE - start_addr, w_bytes);
584: /* 足したものが全行数 */
585: total_line = pline + start_line;
586:
587: /* line は一旦無効に */
588: line = -1;
589:
590: /* スクロールバーに反映 */
591: /* 現在位置は後で計算するのではみださないように 0 にしておく */
592: scrlbar->SetScrollbar(0, num.y, total_line, num.y - 1);
593: }
594:
595: // アドレス変更
596: void
597: MyFrame::DoUpdateAddr()
598: {
599: if (line < 0) {
600: /* line が無効ならアドレスを近いところに */
601: line = (addr + start_offset) / w_bytes;
602: }
603:
604: /* 行からアドレスを求める */
605: addr = line * w_bytes - start_offset;
606:
607: /* アドレス欄に反映 */
608: wxString str;
1.1.1.2 root 609: str.Printf(wxT("%05X"), addr);
1.1 root 610: addrctrl->SetValue(str);
611:
612: /* スクロールバーに反映 */
613: int current = scrlbar->GetThumbPosition();
614: if (addr / w_bytes != current) {
615: scrlbar->SetThumbPosition(line);
616: }
617:
618: /* イメージ作成 */
619: CreateImage();
620: }
621:
622: // イメージ作成
623: bool
624: MyFrame::CreateImage()
625: {
626: unsigned char *imagebuf;
1.1.1.6 ! root 627: std::vector<unsigned char> buf(bytes);
1.1 root 628: size_t n;
629: int minus_addr;
630:
631: imagebuf = viewctrl->imagebuf;
632:
633: /* 全面クリア */
634: memset(imagebuf, 0xff, view.x * view.y * 3);
635:
636: /* ファイルが準備できていなければ何もしない */
637: if (!file.IsOpened()) {
638: return true;
639: }
640:
641: if (addr >= 0) {
642: file.Seek(addr);
643: minus_addr = 0;
644: } else {
645: file.Seek(0);
646: minus_addr = addr;
647: }
648:
649: for (int cy = 0; cy < num.y; cy++) {
650: for (int cx = 0; cx < num.x; cx++) {
651: unsigned char *p =
652: &imagebuf[((view.x * bdsz.y) * cy + bdsz.x * cx) * 3];
653: /* ファイルオフセットが正なら1文字分読み込み */
654: if (minus_addr >= 0) {
1.1.1.6 ! root 655: n = file.Read(buf.data(), buf.size());
1.1 root 656: } else {
657: /* 負なら0バイト読んだことにしてカウントだけする */
658: /* 文字の途中でプラスに転じるケースは面倒なので無視 */
659: minus_addr += bytes;
660: n = 0;
661: }
662:
663: /* 展開 */
664: for (int y = 0; y < oct.y; y++) {
665: for (int x = 0; x < oct.x; x++) {
666: int offset = y * oct.x + x;
667: if (offset >= n) {
668: /* ファイルからはみ出る部分は塗りつぶし? */
669: memset(p, BORDER_COLOR, 8 * 3);
670: p += 8 * 3;
671: continue;
672: }
673: unsigned char ch = buf[offset];
674: for (int b = 0; b < 8; b++) {
675: if ((ch & 0x80)) {
676: p[0] = 0;
677: p[1] = 0;
678: p[2] = 0;
679: }
680: ch <<= 1;
681: p += 3;
682: }
683: }
684: /* 右境界線 */
685: p[0] = BORDER_COLOR;
686: p[1] = BORDER_COLOR;
687: p[2] = BORDER_COLOR;
688: p += 3;
689:
690: p -= bdsz.x * 3;
691: p += view.x * 3;
692: }
693: /* 下境界線 */
694: memset(p, BORDER_COLOR, bdsz.x * 3);
695: }
696: }
697:
698: /* 画面を再描画させる */
699: viewctrl->Refresh(false);
700:
701: return true;
702: }
703:
704: // イベントテーブル
1.1.1.4 root 705: wxBEGIN_EVENT_TABLE(ViewCtrl, inherited)
1.1 root 706: EVT_PAINT(ViewCtrl::OnPaint)
1.1.1.4 root 707: wxEND_EVENT_TABLE()
1.1 root 708:
709: // コンストラクタ
710: ViewCtrl::ViewCtrl(wxWindow *parent)
711: : inherited(parent, wxID_ANY,
712: wxDefaultPosition, wxSize(VIEW_WIDTH, VIEW_HEIGHT))
713: {
714: imagebuf = new unsigned char [ VIEW_WIDTH * VIEW_HEIGHT * 3 ];
715: }
716:
717: // ペイントイベント
718: void
719: ViewCtrl::OnPaint(wxPaintEvent& event)
720: {
721: wxPaintDC dc(this);
722:
723: wxImage image(VIEW_WIDTH, VIEW_HEIGHT, imagebuf, true);
724: wxBitmap bitmap(image);
725: wxMemoryDC memDC(bitmap);
726:
727: dc.Blit(0, 0, VIEW_WIDTH, VIEW_HEIGHT, &memDC, 0, 0);
728: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.