На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> Ошибка в DialogBox( ) - HELP
    Компилю в Билдере , а он и выдаёт:

    [C++ Error] Resource.cpp(90): E2034 Cannot convert 'int (__stdcall *)(void *,unsigned int,unsigned int,long)' to 'int (__stdcall *)()'
    [C++ Error] Resource.cpp(90): E2342 Type mismatch in parameter 'lpDialogFunc' (wanted 'int (__stdcall *)()', got 'int (__stdcall *)(void *,unsigned int,unsigned int,long)')

    Понятно что ему не нравится указатель на ф-ию но почему ?

    Не понятно почему он это делает ведь все объявленно правильно (несколько раз проверял).

    ..........
              case WM_COMMAND:

                    switch(wParam)
                    {
                      case IDM_ViewString:
                            MessageBox(NULL,"view","Test",MB_OK);
                            break;

                      case IDM_ChooseString:

                           DialogBox(hInst,"SpinDialog",hWnd,SpinDialogProc);
                           break;
                     ................
                     }

    BOOL CALLBACK SpinDialogProc(HWND hDlg,UINT Msg,WPARAM wParam,LPARAM lParam)
    {
    ....
    }
      прототипа функции нет?
      а определение твоей коллбэк функции случайно не после использования в:   DialogBox(hInst,"SpinDialog",hWnd,SpinDialogProc); ?

         
        прототип есть

        LRESULT CALLBACK TestWndProc(HWND,UINT,UINT,LONG);
        BOOL CALLBACK SpinDialogProc(HWND,UINT,WPARAM,LPARAM);
        HINSTANCE hInst;


        А с прототипом все равно где опредлен.

          вообще то не все равно где он определен. Он должен быть определен в этом же модуле и обязательно до вызова DialogBox(hInst,"SpinDialog",hWnd,SpinDialogProc);
            Я пробовал определять и до и после
            (кстати и Petzold'a определенно после).

              я не правильно выразился:

              А с прототипом все равно где опредлен.

              ......

              А с прототипом все равно где опредлен код ф-ии.


                Вот куски кода:

                ///// *.cpp

                #include <vcl.h>
                #include "Test.h"
                USERC("Test.rc");

                // прототипы ф-ий

                LRESULT CALLBACK TestWndProc(HWND,UINT,UINT,LONG);
                BOOL CALLBACK SpinDialogProc(HWND,UINT,WPARAM,LPARAM);
                HINSTANCE hInst;

                //---------------------------------------------------------------------------
                WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCommandLine, int nCmdShow)
                {
                HWND hWnd;
                WNDCLASS WndClass;
                MSG Msg;

                char szClassName[] = "ResTest";
                hInst=hInstance;

                .............

                InitCommonControls();

                ..........
                 return Msg.wParam;
                }

                LRESULT CALLBACK TestWndProc(HWND hWnd,UINT Msg,UINT wParam,LONG lParam)
                {

                         switch (Msg)
                         {

                          case WM_CREATE :
                               return 0;

                          case WM_COMMAND:

                                switch(wParam)
                                {
                                  case IDM_ViewString:
                                        MessageBox(NULL,"view","Test",MB_OK);
                                        break;

                                  case IDM_ChooseString:
                                       DialogBox(hInst,"SpinDialog",hWnd,SpinDialogProc);
                                       break;
                ..............
                ..........
                return DefWindowProc (hWnd,Msg,wParam,lParam);
                }

                BOOL CALLBACK SpinDialogProc(HWND hDlg,UINT Msg,WPARAM wParam,LPARAM lParam)
                {

                static HWND hEditWnd;
                static HWND hSpinWnd;

                       switch(Msg)
                       {

                         case WM_INITDIALOG:

                               hEditWnd = GetDlgItem(hDlg,Id_Edit);
                               hSpinWnd = CreateUpDownControl(WS_CHILD|WS_BORDER|WS_VISIBLE|
                                          UDS_SETBUDDYINT|UDS_ALIGNRIGHT,
                                          0,12,50,50,
                                          hDlg,Id_Spin,hInst,hEditWnd,100,0,50);
                               return TRUE;

                         case WM_COMMAND:

                               switch(LOWORD(wParam))
                               {
                                 case Id_OK:
                                       EndDialog(hDlg,0);
                                       return TRUE;
                               }
                               break;

                       }

                return FALSE;
                }


                ////////// *.rc

                SpinDialog DIALOG 0,0,100,100
                STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP|WS_VISIBLE|WS_CAPTION|WS_SYSMENU
                CAPTION "Choose String"
                FONT 8,"Ms Sahs Serif"
                {
                DEFPUSHBUTTON "OK",Id_OK,25,60,50,14
                CONTROL "",Id_Edit,"edit",ES_LEFT|WS_CHILD|WS_VISIBLE|WS_BORDER|WS_TABSTOP|
                ES_NUMBER,25,20,50,12
                }
                  Цитата klep, 20.03.02, 18:14:04
                  Компилю в Билдере , а он и выдаёт:

                  [C++ Error] Resource.cpp(90): E2034 Cannot convert 'int (__stdcall *)(void *,unsigned int,unsigned int,long)' to 'int (__stdcall *)()'
                  [C++ Error] Resource.cpp(90): E2342 Type mismatch in parameter 'lpDialogFunc' (wanted 'int (__stdcall *)()', got 'int (__stdcall *)(void *,unsigned int,unsigned int,long)')

                  Понятно что ему не нравится указатель на ф-ию но почему ?

                  Не понятно почему он это делает ведь все объявленно правильно (несколько раз проверял).

                  }

                  попробуй так:
                  typedef int (__stdcall *DLGDUNC)();
                  А при вызове диалога насильно приведи указатель на функцию к этому типу
                  (DLGFUNC)MyDlgFunc

                  Если нормально заработает, то какая тогда нахрен разница,
                  почему ему тот указатель не нравился !
                    помогло,спасибо.
                    1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0.0930 ]   [ 15 queries used ]   [ Generated: 25.07.26, 15:05 GMT ]