วันอาทิตย์ที่ 13 พฤษภาคม พ.ศ. 2555

Sketckup Ruby C เรียก MFC Dialog

ในการสร้าง Dialog ใน Sketchup Ruby ปรกติแล้วจะใช้ Html และ Javascript ในการสั่งงาน ซึ่งก็ใช้ง่าย
แต่ปัญหา คือการ Debug จะทำไม่ได้ เพราะ เป็น Web และถ้าต้องการทำงานในลักษณะ Interactive
 Dialog ทำไม่ได้ โดยตรง  การใช้งานในลักษณะ Dialog Box จะง่ายกว่า ใน C++ และ  Window จะมี
Dialog อยู่แล้วคือ MFC , Microsoft Foundation Class ซึ่ง ได้พัฒนา เป็น Dotnet
การใช้งาน MFC จะใช้ใน C++
การใช้ Ruby C extension ใช้ MFC ไม่ซับซ้อน ให้ ทำการ New project ใน Visual Studio
เลือกเป็น MFC DLL


ให้เพิ่ม ไฟล์ที่เป็น C สำหรับ ruby init  เช่น initRb.c
แก้ไข init_<ชื่อไฟล์ Dll> เป็น o_<ชื่อDll>
เหตุผลคือ Sketckup เป็นโปรแกรมที่ UserInterface ไม่ได้ ใช้MFC
Sketckup เขียนเอง ทำงานได้ทั้ง Windows และ Mac  การจะใช้ Dialog ของ Mfc จะต้องจัดการ เรื่องสถานะของ Dialog ให้ Windows รับรู้ จึงต้องไปกำหนด ใน ไฟล์ของ MFC


///// Ruby Headers /////
#include <ruby.h>
 VALUE f_Hello( VALUE self );
 static VALUE g_TI_ExtTest; // module 

void o_rbMfc1( void )
{
   // define Module
    g_TI_ExtTest = rb_define_module( "RBMFC" );
    
    rb_define_const( g_TI_ExtTest, "VERSION", rb_str_new2( "1.0" ) );
    
    rb_define_module_function( g_TI_ExtTest, "hi",(VALUE *)f_Hello, 0 );
}

ใน Code ของ MFC ที่สร้างให้ แทรก Code Init



extern "C" void o_rbMfc1( void );
 __declspec( dllexport ) void Init_rbMfc1( void )
{
   // define Module
AFX_MANAGE_STATE(AfxGetStaticModuleState());
 AfxMessageBox("Hello",MB_OK);
   o_rbMfc1();
}



AFX_MANAGE_STATE จะเป็นตัวควบคุม สถานะของ Dialog

ตัวอย่าง คำสั่งของ MFC ใส่ AfxMessageBox เป็น Alert Dialog ที่จะแสดง Hello เมื่อ เรียก Require ใน Ruby Sketchup

Compiler ตั้งค่าเหมือนใน บทความที่แล้ว โดยให้ Output ไปอยู่ที่ folder plugins ของ Sketchup

Compile แล้ว   ทดลอง require ใน Ruby Console จะแสดงหน้าต่าง hello




การเชื่อมกับ MFC เป็นอัน สำเร็จ สำหรับ การสร้าง Dialog ของ MFC ก็ทำตามมาตราฐาน ของ MFC ทั่วไป หาจาก google หรือ youtube และต้องไม่ลืมว่าก่อนการแสดงผลต้อง ทำ AFX_MANAGE_STATE ก่อน


ไม่มีความคิดเห็น:

แสดงความคิดเห็น