Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: [VC] Cannot convert parameter 1 from 'const char [23]' to 'const wchar_t *'

  1. #1
    No Avatar
    lychailon Khách

    Mặc định [VC] Cannot convert parameter 1 from 'const char [23]' to 'const wchar_t *'

    Mình đang đọc quyển "MS Press - Programming with Microsoft Visual C++ .NET 6th Edition"

    Trong chương 6 , có 1 cái vd mà mình làm theo nhưng không build được. Do quyển sách dạy dựa vào VS2k3, còn mình sài cái VS2k5. Nội dung vd và lỗi nó như sau :

    Chương 6: Classic GDI Functions, Fonts, and Bitmaps .

    .....

    The Ex06a Example
    This example sets up a view window with the logical twips mapping mode. A text string is displayed in 10-point sizes with the Arial TrueType font. Here are the steps for building the application:

    Use the MFC Application Wizard to generate the Ex06a project. Start by choosing New from the File menu, and then select MFC Application. Select Single Document on the Application Type page, and deselect Printing And Print Preview on the Advanced Features page. Accept all the other default settings.

    Select the CEx06aView class in Class View, and then use the Properties window to override the OnPrepareDC function in the CEx06aView class. Edit the code in Ex06aView.cpp as follows:

    CODE
    void CEx06aView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
    {

    pDC->SetMapMode(MM_ANISOTROPIC);
    pDC->SetWindowExt(1440, 1440);
    pDC->SetViewportExt(pDC->GetDeviceCaps(LOGPIXELSX),
    pDC->GetDeviceCaps(LOGPIXELSY));
    }

    Add a private ShowFont helper function to the view class. Add the following prototype in Ex06aView.h:

    CODE
    private:
    void ShowFont(CDC* pDC, int& nPos, int nPoints);


    Then add the function itself in Ex06aView.cpp:

    CODE
    void CEx06aView::ShowFont(CDC* pDC, int& nPos, int nPoints)
    {
    TEXTMETRIC tm;
    CFont fontText;
    CString strText;
    CSize sizeText;

    fontText.CreateFont(-nPoints * 20, 0, 0, 0, 400,
    FALSE, FALSE, 0,
    ANSI_CHARSET, OUT_DEFAULT_PRECIS,
    CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
    DEFAULT_PITCH | FF_SWISS, "Arial"); <<== lỗi 1
    CFont* pOldFont = (CFont*) pDC->SelectObject(&fontText);
    pDC->GetTextMetrics(&tm);
    TRACE("points = %d, tmHeight = %d, tmInternalLeading = %d,"
    " tmExternalLeading = %d\n", nPoints, tm.tmHeight,
    tm.tmInternalLeading, tm.tmExternalLeading);
    strText.Format("This is %d-point Arial", nPoints); <== lỗi 2
    sizeText = pDC->GetTextExtent(strText);
    TRACE("string width = %d, string height = %d\n", sizeText.cx,
    sizeText.cy);
    pDC->TextOut(0, nPos, strText);
    pDC->SelectObject(pOldFont);
    nPos += tm.tmHeight + tm.tmExternalLeading;
    }


    Edit the OnDraw function in Ex06aView.cpp. The MFC Application Wizard always generates a skeleton OnDraw function for your view class. Find the function, and replace the code with the following:

    CODE
    void CEx06aView::OnDraw(CDC* pDC)
    {
    int nPosition = 0;

    for (int i = 6; i <= 24; i += 2) {
    ShowFont(pDC, nPosition, i);

    }

    TRACE("LOGPIXELSX = %d, LOGPIXELSY = %d\n",
    pDC->GetDeviceCaps(LOGPIXELSX),
    pDC->GetDeviceCaps(LOGPIXELSY));
    TRACE("HORZSIZE = %d, VERTSIZE = %d\n",
    pDC->GetDeviceCaps(HORZSIZE),
    pDC->GetDeviceCaps(VERTSIZE));
    TRACE("HORZRES = %d, VERTRES = %d\n",
    pDC->GetDeviceCaps(HORZRES),
    pDC->GetDeviceCaps(VERTRES));
    }


    Build and run the Ex06a program. You must run the program from the debugger if you want to see the output from the TRACE statements. You can choose Start from the Debug menu in Visual C++ .NET, press the F5 key, or click the Continue button on the Debug toolbar (which will force the project to be built).


    Error 1 error C2664: 'CFont::CreateFontW' : cannot convert parameter 14 from 'const char [6]' to 'LPCTSTR' c:\documents and settings\my documents\visual studio 2005\projects\ex06a\ex06a\ex06aview.cpp 78


    Error 2 error C2664: 'void ATL::CStringT<BaseType,StringTraits>::Format(const wchar_t *,...)' : cannot convert parameter 1 from 'const char [23]' to 'const wchar_t *' c:\documents and settings\m15\my documents\visual studio 2005\projects\ex06a\ex06a\ex06aview.cpp 84


    Nếu mà tui build trong VS2k3 thì không thấy báo lỗi này. Còn trong VS2k5 thì nó báo cái lỗi mà tui hong bíet đường sữa như thế nào nữa. Đang tự học , không ai hướng dẫn, không kinh nghiệm. Tới đây là pó tòan thân luôn. hix hix. Ai đó giúp tui với.

    Sẵn tiện mấy bác cho hỏi luôn nha. có mấy thuật ngữ mình không hiểu cho lắm, bạn nào biết thì giải thích giúp với nha.

    Mapping Modes :
    Device Context : ...The Microsoft Windows device context is the key GDI element that represents a physical device. Each C++ device context object has an associated Windows device context, which is identified by a 32-bit handle of type HDC.... << hix, mình dịch hong nỗi đọan này, bác nào biết giúp với.

    Còn đọan này nữa. Đọc mãi hong hiểu ra sao nữa.

    ...
    The State of the Device Context
    You already know that a device context is required for drawing. When you use a CDC object to draw an ellipse, for example, what you see on the screen (or on hard copy) depends on the current "state" of the device context. The state includes the following:

    Attached GDI drawing objects such as pens, brushes, and fonts.

    The mapping mode that determines the scale of items when they are drawn. (You already experimented with the mapping mode in Chapter 5.)

    Various details such as text alignment parameters and polygon filling mode.

    You've seen, for example, that selecting a gray brush before drawing an ellipse results in the ellipse having a gray interior. When you create a device context object, it has certain default characteristics, such as a black pen for shape boundaries. All other state characteristics are assigned through CDC class member functions. GDI objects are selected into the device context by means of the overloaded SelectObject functions. A device context can, for example, have one pen, one brush, or one font selected at any given time.


    Cám ơn mí bác trước lun nha.

  2. #2
    Ngày gia nhập
    08 2006
    Nơi ở
    TpHCM
    Bài viết
    202

    lỗi 1,2: thay "Arial" bằng _T("Arial") hoặc L "Arial", tương tự thay "This is %d-point Arial" bằng _T("This is %d-point Arial") hoặc L "This is %d-point Arial"

    sự khác nhau giữa VS2003 và VS2005 có thể xuất phát từ cách làm của bạn hoặc trong setting của 2 prj

  3. #3
    Ngày gia nhập
    07 2006
    Bài viết
    166

    Cứ dịch bình thường thôi, riêng từ "device context" thì không dịch vì dịch ra còn khó hiểu hơn

  4. #4
    No Avatar
    lychailon Khách

    Trích dẫn Nguyên bản được gửi bởi nguyentuan2
    lỗi 1,2: thay "Arial" bằng _T("Arial") hoặc L "Arial", tương tự thay "This is %d-point Arial" bằng _T("This is %d-point Arial") hoặc L "This is %d-point Arial"

    sự khác nhau giữa VS2003 và VS2005 có thể xuất phát từ cách làm của bạn hoặc trong setting của 2 prj
    à há. Chạy được gòi. Nhưng mình không hiểu việc thay đổi đó làm động tác gì mà khiến cho VS2k5 chấp nhận vậy bạn. _T("") là một hàm chuyển kiểu hả bạn ? _T() với L"" nó giống khác nhau chỗ nào vậy bạn. Tìm thông tin về nó trong msdn = từ khóa nào vậy ?

    Hỏi nhiều nhỉ . Hy vọng bạn giúp đỡ. Cám ơn nhìu nha.

  5. #5
    No Avatar
    namleb Khách

    Trích dẫn Nguyên bản được gửi bởi lychailon
    à há. Chạy được gòi. Nhưng mình không hiểu việc thay đổi đó làm động tác gì mà khiến cho VS2k5 chấp nhận vậy bạn. _T("") là một hàm chuyển kiểu hả bạn ? _T() với L"" nó giống khác nhau chỗ nào vậy bạn. Tìm thông tin về nó trong msdn = từ khóa nào vậy ?

    Hỏi nhiều nhỉ . Hy vọng bạn giúp đỡ. Cám ơn nhìu nha.
    - CT của bạn đã xài tới chuỗi và đã include TCHAR.h, bạn xem trong TCHAR.h sẽ thấy định danh _UNICODE được định nghĩa. Do đó, string trong ct của bạn chứa mỗi ký tự 16-bit (2 byte) thay vì 8-bit (ANSI C standard).

    - Vì vậy lỗi 1 & 2 tương tự nhau, không thể convert string (ANSI C standard) sang ký tự mở rộng (wchar hay UNICODE!). VC cung cấp hàm chuyển string từ 8-bit char sang 16-bit wchar là _T(), _TEXT(), TEXT()
    TEXT(
    LPTSTR string
    );
    //string: Pointer to the string to interpret as UTF-16 or ANSI.

    - Chữ L tương tự hàm _T() - long .

    - http://msdn2.microsoft.com/en-us/library/ms776412.aspx

    - Nếu bạn quan tâm tới tiếng Việt thì sẽ gặp nhiều! .

    P/S: Tui chưa đụng tới VS2k5 mặc dù có 2 cái DVD còn mới cáu .

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

  1. con trỏ const trong c++ lỗi: cannot convert 'this' pointer from 'const newRectangle' to 'newRectangle &'?
    Gửi bởi cautrucdulieu trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 02-10-2012, 11:45 PM
  2. Convert char** to const char** như thế nào?
    Gửi bởi iamme22021990 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 7
    Bài viết cuối: 31-05-2012, 10:27 PM
  3. sự khác nhau giữa: const char * và char const *
    Gửi bởi trihn_kt trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 6
    Bài viết cuối: 18-03-2012, 08:29 AM
  4. lỗi cannot convert `const char*' to `const WCHAR*' for argument khi dùng autoit với c++
    Gửi bởi morongtraitim88 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 03-06-2011, 08:54 PM
  5. Lỗi error C2440: 'initializing' : cannot convert from 'const char [10]' to 'TCHAR *'?
    Gửi bởi vietwow trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 0
    Bài viết cuối: 12-04-2011, 05:46 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