LINUX.ORG.RU

этот жутковатый win api


0

1

Вообщем, не могу скомпилить прожку. Errors:
asyaka@asyaka:~/prog/project$ i586-mingw32msvc-g++ -o ex1 ex1.o ex1.cxx -mwindows
In file included from ex1.cxx:7:
ex1.rc:7: error: expected unqualified-id before numeric constant
ex1.cxx: In function ‘int WinMain(HINSTANCE__*, HINSTANCE__*, CHAR*, int)’:
ex1.cxx:32: error: ‘WndProc’ was not declared in this scope

Сам проектик http://ifolder.ru/30764566


Проект не смотрел, ибо на богомерзком айфолдере. Алсо, ты хидеры, видать, не подключил.

jessey
()

Не знаю в чём проблема, но вторая ошибка решается перенесением WndProc выше по коду чем WinMain. Почему недостаточно прототипа — понятия не имею. Первая ошибка говорит о том, что ex1.rc файл не является корректным кодом на плюсах. После разворачивания макросов он выглядит как

2 MENU
BEGIN
    POPUP "&File"
    BEGIN
        MENUITEM "E&xit", 103
    END
END

что явно не похоже на корректный плюсовый код.

kim-roader ★★
()

‘int WinMain(HINSTANCE__*, HINSTANCE__*, CHAR*, int)’

int WINAPI WinMain(...), емнип.

damnemall
()
Ответ на: комментарий от kim-roader

Ну да, прототип не распознаёт как раз из-за этого мусора из ex1.rc который у тебя включается в результат дериктивой #include. Если не инклюдить, то прототип тоже нормально проглатывается.

kim-roader ★★
()
Ответ на: комментарий от kim-roader

и как он должен выглядеть? во всех манах так написано. если поменять begin\end на скобочки, вторая ошибка съедается, а первая остаётся.

asyaka
() автор топика
Ответ на: комментарий от kim-roader

если не инклюдить,то:
In file included from ex1.cxx:7:
ex1.rc:3: error: ‘IDC_MENU’ does not name a type
чего-то явно не хватает =\

asyaka
() автор топика
Ответ на: комментарий от kim-roader
tar xzf ../project.tar.gz ; sed -i '/ex1.rc/d' ex1.cxx ; i586-mingw32msvc-windres ex1.rc Rex1.o ; i586-mingw32msvc-g++ ex1.cxx Rex1.o -mwindows ; wine ./a.exe 

На моём дебианчике компиляется и запускается.

kim-roader ★★
()
Ответ на: комментарий от asyaka
$ i586-mingw32msvc-windres --version
GNU windres (GNU Binutils) 2.22
Copyright 2011 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or (at your option) any later version.
This program has absolutely no warranty.
$ i586-mingw32msvc-g++ --version
i586-mingw32msvc-g++ (GCC) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

УМВР.

kim-roader ★★
()

#include «ex1.rc»

.rc файл нужно не инклудить, а компилировать windres'ом.

MessageBox(NULL, «Не могу зарегистрировать класс окна», «Error», MB_OK | MB_ICONERROR);

Выведет тебе мусор вместо русского текста. WinAPI не понимает мультибайтовые кодировки, а у тебя:

ex1.cxx: C source, UTF-8 Unicode text

Правильно будет запихнуть все русские строки в ресурс, и дергать их оттуда в рантайме. Ну и использовать wide-версии API функций через #define UNICODE.

Deleted
()
Ответ на: комментарий от Harald

так указала. что-то всё равно забыла. говорит, аж во:

ex1.cxx:33: error: ‘INITCOMMONCONTROLSEX’ was not declared in this scope
ex1.cxx:33: error: expected `;' before ‘icc’
ex1.cxx:37: error: ‘icc’ was not declared in this scope
ex1.cxx:38: error: ‘ICGetModuleHandle’ was not declared in this scope
ex1.cxx:38: error: expected `;' before ‘C_WIN95_CLASSES’
ex1.cxx:39: error: ‘InitCommonControlsEx’ was not declared in this scope

asyaka
() автор топика
Ответ на: комментарий от anonymous

ТС всё правильно сделал. По MinGW32 задает вопрос на тематическом форуме.

pacify ★★★★★
()
Ответ на: комментарий от anonymous

Боже, недотроли, неужели вы такими сразу с карточкой в голове родились, на которой записаны все знания мира? Кажется, здесь достаточно просвященных, чтобы обсудить данный вопрос.

asyaka
() автор топика
Ответ на: комментарий от asyaka

Кажется, здесь достаточно просвященных

«просвященных» в эту сторону всяко больше на rsdn

обсудить данный вопрос

здесь нечего обсуждать, нужно курить матчасть, чтобы было о чём задавать вопросы

anonymous
()
Ответ на: комментарий от asyaka

ты не улавливашь, почему тебя сначала отвели в школу, а потом ты поступишь в вуз (ну, если вдруг)?

anonymous
()
Ответ на: комментарий от anonymous

я уже в вузе, лол. скажи, чем таким твое изысканное курево должно помочь мне с инициализацией либы?

asyaka
() автор топика
Ответ на: комментарий от anonymous

нет, девушка. проблемс?
я прошу простой помощи, что ты здесь забыл?

asyaka
() автор топика
#include <windows.h>
#include <winerror.h>
#include <commctrl.h>
#include <cstdio>
#include <cstdlib>
/*
  mingw32-g++ -Wall ./main.cpp -o ./main -mwindows -L"C:/MinGW/lib" -lgdi32 -luser32 -lcomctl32
*/
//-------------------------------------------------------------------------
MSG msg;/* Сообщения, приходящие окну */
WNDCLASSEX wc;/* Класс окна */
HWND hWnd;/* HANDLE окна */
HWND hSlider;/* HANDLE слайдера */
HWND hButton;/* HANDLE checkbox-а */
LPCTSTR lpzClass=TEXT("WinAPI_window_opacity");/* Имя класса окна */
//-------------------------------------------------------------------------
LRESULT CALLBACK WindowProc(HWND hwnd,UINT message,     \
                            WPARAM wParam,LPARAM lParam \
                            )
{/* Обработчик сообщений главного окна */
  switch(message)
  {
  case WM_COMMAND:
    {
      if((HWND)lParam == hButton)
      {/* Проверка, checkbox прислал сообщение, или нет */
        WINDOWINFO wi;
        GetWindowInfo(hWnd,&wi);/* Получаем информацию о главном окне */
        /* Спрашиваем состояние checkbox-а */
        LPARAM lp=::SendMessage(hButton,BM_GETCHECK,(WPARAM)0,(LPARAM)0);
        if(lp == BST_CHECKED)/* Если взведён */
          SetWindowPos(hWnd,HWND_TOPMOST,                   \
                       wi.rcWindow.left,wi.rcWindow.top,    \
                       wi.rcWindow.right-wi.rcWindow.left,  \
                       wi.rcWindow.bottom-wi.rcWindow.top,  \
                       0                                    \
                       );/* Удерживаем окно поверх остальных */
        else if(lp == BST_UNCHECKED)/* Если сброшен */
          SetWindowPos(hWnd,HWND_NOTOPMOST,                 \
                       wi.rcWindow.left,wi.rcWindow.top,    \
                       wi.rcWindow.right-wi.rcWindow.left,  \
                       wi.rcWindow.bottom-wi.rcWindow.top,  \
                       0                                    \
                       );/* Обычное поведение окна */
      }
      break;
    }
  case WM_HSCROLL:
    {/* Сообщение от слайдера */
      if((LOWORD(wParam) >= TB_LINEUP) &&       \
         (LOWORD(wParam) <= TB_ENDTRACK)        \
         )
      {/* Если производилось изменение положения движка */
        COLORREF colorref=RGB(0xC8,0xD0,0xD4);
        /* Запрашиваем текущее положение движка */
        DWORD pos=::SendMessage(hSlider,TBM_GETPOS,(WPARAM)0,(LPARAM)0);
        /* На основании его устанавливаем прозрачность окна */
        SetLayeredWindowAttributes(hWnd,colorref,pos,LWA_ALPHA);
      }
      break;
    }
  case WM_DESTROY:
    {/* Когда закрывается главное окно */
      ::PostQuitMessage(0);
      break;
    }
  default:
    return ::DefWindowProc(hwnd,message,wParam,lParam);
  }
  return 0;
}
//-------------------------------------------------------------------------
int APIENTRY WinMain(HINSTANCE hInstance,       \
                     HINSTANCE hPrevInstance,   \
                     LPSTR lpCmdLine,           \
                     int nCmdShow               \
                     )
{
  /* Инициализируем движок стандартных компонент GDI */
  InitCommonControls();
  
  /* Инициализируем класс главного окна */
  wc.cbSize=sizeof(WNDCLASSEX);
  wc.style=CS_HREDRAW | CS_VREDRAW;
  wc.lpfnWndProc=(WNDPROC)WindowProc;
  wc.cbClsExtra=0;
  wc.cbWndExtra=sizeof(LONG);
  wc.hInstance=hInstance;
  wc.hIcon=NULL;
  wc.hCursor=::LoadCursor(0,IDC_ARROW);
  wc.hbrBackground=(HBRUSH)COLOR_WINDOW;
  wc.lpszMenuName=NULL;
  wc.lpszClassName=lpzClass;
  /* Регистрируем его в системе */
  if(::RegisterClassEx(&wc) == 0)
  { printf("Error code is %li\n",::GetLastError()); return 1; }
  
  /* Создаём главное окно приложения на основе
     зарегистрированного класса окна wc */
  hWnd=::CreateWindowEx(WS_EX_LAYERED | WS_EX_TOOLWINDOW, \
                        lpzClass,"Opacity window",        \
                        WS_OVERLAPPEDWINDOW | WS_VISIBLE, \
                        10,10,385,150,                    \
                        0,0,NULL,NULL                     \
                        );
  
  /* Создаём checkbox управления поддержанием окна на переднем плане */ 
  hButton=::CreateWindowEx(0,"BUTTON","Foreground",                 \
                           WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, \
                           210,10,250,25,hWnd,0,NULL,NULL           \
                           );
  
  /* Создаём слайдер регулировки прозрачности окна */
  hSlider=::CreateWindowEx(0,TRACKBAR_CLASS,NULL,             \
                           WS_CHILD | WS_VISIBLE | TBS_HORZ,  \
                           10,10,200,25,hWnd,0,NULL,NULL      \
                           );
  /* Установка диапазона регулировки прозрачности */
  ::SendMessage(hSlider,TBM_SETRANGE,(WPARAM)TRUE,  \
                (LPARAM)MAKELONG(0x50,0xFF));
  /* Установка начального положения слайдера */
  ::SendMessage(hSlider,TBM_SETPOS,(WPARAM)TRUE,  \
                (LPARAM) (LONG)0xFF);
  
  COLORREF colorref=RGB(0xC8,0xD0,0xD4);
  /* Установка прозрачности окна */
  if(SetLayeredWindowAttributes(hWnd,colorref,0xFF,LWA_ALPHA))
    printf("failed set window opacity\n");
  
  ::ShowWindow(hWnd,SW_SHOWNORMAL);
  ::UpdateWindow(hWnd);
  
  /* Цикл выборки сообщений */
  int iGetOK;
  while((iGetOK=::GetMessage(&msg,NULL,0,0)))
  {
    if(iGetOK <= 0)
    { printf("Error code is %li\n",::GetLastError()); return 1; }
    ::TranslateMessage(&msg);
    ::DispatchMessage(&msg);
  }
  return msg.wParam;
}

Вот плоды моих детских игрищ, компилируется и работает. Может, что пригодится отсюда.

one_more_hokum ★★★
()
Ответ на: комментарий от one_more_hokum

Спасибо) Как ни странно, заработало =)

asyaka
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.