Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 12 kết quả

Đề tài: C++ & MFC, Những vấn đề nan giải?

  1. #1
    Ngày gia nhập
    10 2007
    Bài viết
    10

    Mặc định C++ & MFC, Những vấn đề nan giải?

    Mấy hôm nay mình đang vật vả với C++ và MFC, mình có một số câu hỏi muốn hỏi những Pro, chúng ta bắt đầu nhé:
    . Phần Win 32 Application và MFC khác nhau như thế nào? Mình thấy phần MFC có hỗ trợ phần kéo thả công cụ và quản lý sự kiện còn Win 32 Application thì không có(Visual C++ 6.0).
    . Mình thấy trong visual c++ code rất nhiều, có khi xóa nhầm là tiu, vậy có phong cách(hay template) nào viết code cho tốt không?
    . Mình đang nghiên cứu phần mềm gõ dấu tiếng việt, hook mình cũng đã rành, khổ nỗi khi mình dùng hàm keybd_event để gửi 1 phím ảo thì mình khồn gửi được ký tự bỏ dấu, vậy làm thế nào để gửi 1 phím có dấu? (Vấn đề chính nên mong các bạn chỉ rõ)
    . Trong C++.NET mình thấy phần Application Form có hỗ trợ việc kéo thả công cụ sao trong visual c++ 6 phần win 32 application không có? Trong C++.Net bộ công cụ phần MFC sao ít vậy, trong khi Application Form thì 1 đống?
    . Nên học C++ hay C# đây?

    Có thể có những bạn cũng thắc mắc như mình và có những bạn cho những câu hỏi của mình là ngốc ngếch nhưng IT mà?
    Mong các Pro sớm trả lời.

  2. #2
    Ngày gia nhập
    10 2007
    Bài viết
    169

    - VC++ thuộc loại dùng để xây dựng "cơ sở hạ tầng" nên bạn đừng hy vọng nó sẻ giống như C# hay VB! Về việc tại sao VC++ lại đi theo hướng đó thì chỉ MS mới rỏ!

    - Về phần "Win32 Application" và "MFC"! Tên khác nên chắc chắn là phải khác rồi! Win32 Application thuộc loại cơ bản nhất, có nghĩa là bạn phải code tất cả mọi thứ! Cái khác nhau lớn nhất là Win32 App dùng toàn API, còn MFC App dùng...MFC! MFC là một bộ thư viện, tập hợp đa số các hàm API! Khi bạn compile, dùng Win32 App chắc chắn sẻ ra file có size nhỏ hơn!
    - Người ta chỉ dùng Win32 app để viết những app gắn với windows thôi, ai "khùng" lắm mới dùng cái này để viết các app có giao diện ^_^!

    - Thực ra MFC app cũng là Win32 App thôi! Phần kéo thả thì bên Win32 app chắn chắn ko có và ko thể có, vì win32 app thuộc dạng "General" cho tất cả các App của windows, ai mà biết được chúng ta dùng nó để viết cái gì mà support! Phần quản lý sự kiện, win32 dùng thông qua một số hàm như PreTranslateMessage() (dùng các message dạng WM_*)! Vì win32 app dùng file cpp dạng chuẩn theo ngôn ngữ C++ nên sẻ không thể biết chèn mấy cái mesage ở đây (MFC có một số thứ để định dạng mesage và file nguồn như MESAGE MAP,... vì vậy nó mới biết đường mà chèn)!

    - VC++ viết code nhiều nhưng thực sự không nhiều, khi bạn viết quen rồi sẻ thấy chỉ có vài thứ để quan tâm khi viết code thôi (Trừ khi bạn quan tâm quá nhiều đến vấn đề giao diện)!

    - Phần hook đả lâu lằm mình không làm nên cũng ko nhớ rỏ! Nhưng mình nghĩ mỗi khi gỏ sẻ nhận được một ký tự, dựa trên các ký tự đó để thay bằng một ký tự có dấu (như a1 = á, gởi key backspace để xóa "a1")! Mình chưa bao giờ làm phần này nên ko rỏ lắm, vì vậy chỉ nghĩ ra cách vậy thôi ^_^!

    - Phần tool trong VC++ bạn phải tự add vô mới được! Còn vấn đề học C# hay VC++ thì tùy bạn, C# (hay .NET) đang là thời thượng, nhiều Cty cần, nhưng vì quá nhiều người học nên cạnh tranh "khốc liệt" lắm bạn ơi! Lương của programmer ngày càng giảm bởi do "nếu bạn ko làm thì người khác sẻ làm"! Do đó tùy theo con đường bạn đi mà chọn cho mình cái phù hợp nhất!

    - Mình đả từng nghĩ sẻ trở thành một programmer, nhưng bây giờ thì không ! Một programmer trong một cty software ở VN <=> một worker trong một nhà máy, chỉ khác là chúng ta "sang" hơn họ tí thôi!

    - Nếu bạn chọn C# (hay .NET) -> đi theo con đường software thì hảy ráng học thật nhiều để tìm vị trí cao một chút trong cty!

    - Đó chỉ là ý kiến của mình thôi, chúc bạn may mắn!

  3. #3
    Ngày gia nhập
    10 2007
    Bài viết
    10

    Một bài viết rất hay!
    Mình cũng đang phân vân ko biết học cái nào đây! Nhưng cứ chấp nhận thôi, vẫn theo C++ mà cày.
    Trong phần MFC mình thấy cái tool là ít nhất. Bạn nào có link down tool thì send cho mình với.
    Còn hàm keybd_event() tham số mã phím ảo của nó là kiểu byte chỉ dùng cho mã ascii, hình như khi mình đưa mã unicode vào thì nó ko nhận, bạn nào rành phần này xin giúp mình.

  4. #4
    Ngày gia nhập
    10 2007
    Bài viết
    10

    Hình như phần winform bên C++.net nó cũng sài bộ thư viện .net, như vậy thì những gì C# làm được thì C++ cũng làm được đúng ko bạn?

  5. #5
    Ngày gia nhập
    10 2006
    Bài viết
    107

    Dot Net là platform nên mọi ngôn ngữ hỗ trợ trong visual studio đều có thể sử dụng bộ thư viện của Dot Net. Học MFC trước cho nói visual rồi chuyển qua Win32 cũng được mà.
    Nói là một chuyện, làm là một chuyện. Chi bằng ta làm xong rồi hãy nói như vậy thì nói và làm sẽ là một chuyện.

  6. #6
    Ngày gia nhập
    10 2007
    Bài viết
    10

    Mặc định C++ & MFC, Những vấn đề nan giải?

    UHM. Mình cũng đang vật vả với thằng MFC, trước giờ code trên VB, C# thấy công việc lập trình dễ dàng. Nhưng từ ngày học thằng VC,MFC thì thấy mọi chuyện khác hẳn.

  7. #7
    Ngày gia nhập
    10 2007
    Bài viết
    169

    - Phần tool của VC++ đa số đều đc bán T_T! Vì đa số những người dùng VC++ đều không cần đến tool nên nó không được quan tâm đến nhiều! Nếu bạn muốn thêm vào toolbox thì right click vào cái toolbar đó, chọn add item! Khi đó sẻ hiện ra một list các ActiveX, COM component,...! Bạn thích cái nào thì cứ add vô! Có một số software ngốc đến nổi không bảo vệ mấy cái ActiveX khi release, kết quả là bạn có thể lấy trực tiếp mấy cái ActiveX đó để viết soft cho mình luôn (Mình nhớ không lầm là có một số soft về convert các file audio và video, ActiveX của nó có sẳn các hàm encode,decode, chỉ cần lấy ActiveX đó add vô dialog và dùng bình thường ^_^!)

    - Về phần keybd_event() chắc mình ko giúp đc gì, mình search thử trên mạng và thấy nhiều người cũng bị tương tự T_T! Bạn dùng thử CallWndProc xem sao! Dùng CallWndProc để thay thế WindowProc của các App, thông qua WM_KEYDOWN hay WM_KEYUP của WindowProc để send key ! Mỗi khi có Wnd nào đc active hay created thì sethook vào nó và release cái trước đó, như vậy trong một thời điểm chỉ có 1 Wnd đc sethook!

    C++ Code:
    1. LRESULT CALLBACK WindowProc(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)
    2. {
    3.     LRESULT Rs = 0;
    4.     int nIndex =-1;
    5.     nIndex = m_CallWndProcWndInfo.Find(hWnd);
    6.     if(nIndex >= 0)
    7.     {
    8.         switch(Msg)
    9.         {
    10.         case WM_KEYDOWN:
    11.             // Send key here
    12.             break;
    13.         case WM_KEYUP:
    14.             // Send key here
    15.             break;
    16.         case WM_DESTROY:
    17.             {
    18.                 if(m_hCallWndProcParentWnd)
    19.                 {
    20.                     SendMessage(m_hCallWndProcParentWnd,m_uCallWndProcMsg,wParam,lParam);
    21.                 }
    22.  
    23.                 SetWindowLong(hWnd,GWL_WNDPROC,(LONG)(__int64)m_CallWndProcWndInfo.m_pCallWndProcWndInfo[nIndex].WndProc);
    24.                 CallWindowProc(m_CallWndProcWndInfo.m_pCallWndProcWndInfo[nIndex].WndProc,hWnd,Msg,wParam,lParam);
    25.                 m_CallWndProcWndInfo.Delete(nIndex);
    26.                 return 0;
    27.             }
    28.         case WM_PAINT:
    29.             {
    30.                 HDC hDC = GetWindowDC(hWnd);
    31.                 if(hDC)
    32.                 {
    33.                     Rectangle(hDC,0,0,20,20);
    34.                     LineTo(hDC,100,100);
    35.                 }
    36.                 break; 
    37.             }
    38.         case 273:   // Menu clicked
    39.             {
    40.                 if(wParam == 101)   // Menu ID = 101
    41.                 {
    42.                     AfxMessageBox(L"101");
    43.                 }
    44.                 else if(wParam == 102)
    45.                 {
    46.                     AfxMessageBox(L"102");
    47.                 }
    48.                 break;
    49.             }
    50.         };
    51.     }
    52.     return       CallWindowProc(m_CallWndProcWndInfo.m_pCallWndProcWndInfo[nIndex].WndProc,hWnd,Msg,wParam,lParam);
    53. }

    Hình như phần winform bên C++.net nó cũng sài bộ thư viện .net, như vậy thì những gì C# làm được thì C++ cũng làm được đúng ko bạn?
    - Nói chung là đúng vậy nhưng nếu bạn định dùng duy nhất code của .NET thì nên dùng C#! Khi nào cần dùng code của MFC,API,... kết hợp với .NET thì dùng VC++.NET! Mặc dù VC++.NET dùng .NET nhưng template của nó không nhiều! Đơn giản là vì C# hay VB thì bây giờ đả dùng hoàn toàn là .NET nên việc phát triển chỉ trên .NET thôi, còn VC++ phải làm luôn .NET,MFC,ATL,... luôn cả DirectX,driver,... vì vậy dùng VC++.NET để phát triển ứng dụng thuần .NET ko phải là ý hay đâu bạn!

    - Mình cũng thấy dùng C# và VB viết code dễ thật, nhưng với những thứ sâu hơn thì viết bằng C# và VB hơi cực khổ! Nên tốt nhất là dùng C# và VB viết mấy cái app ở lớp trên, VC++ thì lớp dưới hay mấy thứ ko phụ thuộc Lib!

  8. #8
    Ngày gia nhập
    10 2007
    Bài viết
    10

    Phần hook key thì mình làm được nhưng khổ nỗi không biết send key unicode. Lục code của unikey thì thấy nó cũng dùng hàm keybd_event. Bây giờ ko biết sao nữa, mong một ngày nào đó sẽ có cao nhân giúp.
    CHo mình hỏi cái là khi compiler một cái DLL thì nó phát sinh ra mấy file .lib, mấy file đó để chi vậy bạn trong khi cái chính mình làm là .dll mà.

  9. #9
    Ngày gia nhập
    10 2007
    Bài viết
    169

    - Mấy file "*.lib" đó thực ra ko cần cho file exe nhưng rất có ích! Khi bạn dùng file DLL thì sẻ có hai cách!
    1. Define các function trong DLL!
    2. Dùng file "*.lib"

    - Vì ko biết file lib dùng làm gì nên mình nghĩ bạn sẻ dùng cách 1!
    - Nếu bạn dùng cách 2 thì chỉ cần include file "*.h" của phần code sinh ra file DLL! Trong phần linker, add tên của lib vào! Như vậy là xong, compile project là chạy được, ko phải define mấy hàm cần dùng trong DLL, LoadLibrary() tùm lum!

  10. #10
    Ngày gia nhập
    10 2007
    Bài viết
    10

    Cái này mình đọc bên codeproject bọn nó khuyến cáo dùng khai báo DLL. TỤi nó bảo là khi add *.lib vào thì trên file *.cpp gọi hàm của nó thì nó sẽ chuyển phần mã trong thư viện liên kết động vào file đó. Nếu nhiều file như vậy thì sẽ làm nặng chương trình.

Các đề tài tương tự

  1. Cung cấp giấy ik plus, Paper One, Plus A+, Double A, Giấy Thái Lan, Giấy Bãi Bằng, bìa màu, băng dính, mica các loại
    Gửi bởi dungptvietthanh trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 07-06-2013, 04:05 PM
  2. Chung cư Đại Thanh giảm sốc 10tr/vnđ cho các căn hộ. giảm và liên tục giảm…!!
    Gửi bởi lanthanh91 trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 09-10-2012, 10:27 AM
  3. Trả lời: 0
    Bài viết cuối: 06-08-2012, 07:01 PM
  4. Trả lời: 0
    Bài viết cuối: 04-08-2012, 03:08 PM
  5. Trả lời: 0
    Bài viết cuối: 24-05-2012, 04:04 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn