Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2012, 13:45   #1
Асурус
Пользователь
 
Регистрация: 17.03.2012
Сообщений: 15
По умолчанию

вод код:
Код:
#include <windows.h>
#include "KWnd.h"
#include "KDocument.h"

#define FILE_NAME "C:\\README.TXT"

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

KDocument doc;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MSG msg;
   if(!doc.Open(FILE_NAME))
        return 0;

    KWnd mainWnd("Text Viewer", hInstance, nCmdShow, WndProc, NULL, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, CS_HREDRAW | CS_VREDRAW, WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    HDC hDC;
    PAINTSTRUCT ps;
    TEXTMETRIC tm;
    int cxClient = 0, cyClient = 0;
    static int xInc, yInc;

    switch(uMsg)
    {
        case WM_CREATE:
            hDC = GetDC(hWnd);
            GetTextMetrics(hDC, &tm);
            doc.Initialize(&tm);
            ReleaseDC(hWnd, hDC);
            break;

        case WM_SIZE:
            hDC = GetDC(hWnd);
            cxClient = LOWORD(lParam);
            cyClient = HIWORD(lParam);
            if(cxClient > 0)
                doc.ScrollSettings(hWnd, cxClient, cyClient);
            ReleaseDC(hWnd, hDC);
            break;

        case WM_VSCROLL:
            switch(LOWORD(wParam))
            {
                case SB_LINEUP:
                    yInc = -1;
                    break;
                case SB_LINEDOWN:
                    yInc = 1;
                    break;
                case SB_PAGEUP:
                    yInc = -(int)doc.vsi.nPage;
                    break;
                case SB_PAGEDOWN:
                    yInc = (int)doc.vsi.nPage;
                    break;
                case SB_THUMBTRACK:
                    yInc = HIWORD(wParam) - doc.vsi.nPos;
                    break;
                default:
                    yInc = 0;
            }
            doc.UpdateVscroll(hWnd, yInc);
            break;

        case WM_HSCROLL:
            switch(LOWORD(wParam))
            {
                case SB_LINELEFT:
                    xInc = -1;
                    break;
                case SB_LINERIGHT:
                    xInc = 1;
                    break;
                case SB_PAGELEFT:
                    xInc = -0.8 * (int)doc.hsi.nPage;
                    break;
                case SB_PAGERIGHT:
                    xInc = -0.8 * (int)doc.hsi.nPage;
                    break;
                case SB_THUMBTRACK:
                    xInc = HIWORD(wParam) - doc.hsi.nPos;
                    break;
                default:
                    xInc = 0;
            }
            doc.UpdateHscroll(hWnd, xInc);
            break;

        case WM_PAINT:
            hDC = BeginPaint(hWnd, &ps);

            doc.PutText(hWnd, hDC);

            EndPaint(hWnd, &ps);
            break;

        case WM_DESTROY:
            PostQuitMessage(0);
            break;

        default:
            return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    return 0;
}
О выделенном фрагменте пишет: undefined reference to 'KDocument::Open(char const*)'
Цитата:
||=== tv, Debug ===|
obj\Debug\main.o||In function `WinMain@16':|
C:\Users\Aleksei\Library\IT\C++\Pro jects C++\Codeblocks\TextViewer\tv\main.c pp|14|undefined reference to `KDocument::Open(char const*)'|
obj\Debug\main.o||In function `Z7WndProcP6HWND__jjl@16':|
C:\Users\Aleksei\Library\IT\C++\Pro jects C++\Codeblocks\TextViewer\tv\main.c pp|40|undefined reference to `KDocument::Initialize(tagTEXTMETRI CA*)'|
C:\Users\Aleksei\Library\IT\C++\Pro jects C++\Codeblocks\TextViewer\tv\main.c pp|49|undefined reference to `KDocument::ScrollSettings(HWND__*, int, int)'|
C:\Users\Aleksei\Library\IT\C++\Pro jects C++\Codeblocks\TextViewer\tv\main.c pp|74|undefined reference to `KDocument::UpdateVscroll(HWND__*, int)'|
C:\Users\Aleksei\Library\IT\C++\Pro jects C++\Codeblocks\TextViewer\tv\main.c pp|98|undefined reference to `KDocument::UpdateHscroll(HWND__*, int)'|
C:\Users\Aleksei\Library\IT\C++\Pro jects C++\Codeblocks\TextViewer\tv\main.c pp|104|undefined reference to `KDocument::PutText(HWND__*, HDC__*)'|
||=== Build finished: 6 errors, 0 warnings ===|
Вот полная сводка.

Последний раз редактировалось Stilet; 05.05.2012 в 19:04.
Асурус вне форума Ответить с цитированием
Старый 05.05.2012, 15:35   #2
muradov
Пользователь
 
Регистрация: 05.05.2012
Сообщений: 39
По умолчанию

Ну может у KDocument действительно нет таких методов.
muradov вне форума Ответить с цитированием
Старый 06.05.2012, 00:46   #3
Асурус
Пользователь
 
Регистрация: 17.03.2012
Сообщений: 15
По умолчанию

"KDocument.cpp"

Код:
#include <windows.h>
#include <fstream>
#include "KDocument.h"

BOOL KDocument::Open(const char* file)
{
    ifstream finp(file);
    char buf[200];

    if(!finp.good())
    {
        MessageBox(NULL, "Не найден входной файл!", "Error", MB_OK);
        return FALSE;
    }

    while(!finp.eof())
    {
        finp.getline(buf, 199);
        buf[199] = 0;
        lines.push_back(string(buf));
    }
    lineLenMax = 0;
    for(int i = 0; i < lines.size(); ++i)
    {
        int lineLen = lines[i].size();
        int iTabPos = 0;
        while(l)
        {
            iTabPos = lines[i].find('\t', iTabPos);
            if(iTabPos != -1)
            {
                lineLen += 8;
                iTabsPos++;
            }
            else break;
        }
        if(lineLen > lineLenMax)
            lineLenMax = lineLen;
    }
    return TRUE;
}

void KDocument::Initialize(LPTEXTMETRIC tm)
{
    cxChar = tm->tmAveCharWidth;
    yStep = tm->tmHeight + tm->tmExternalLeading;
    vsi.nMin = vsi.nPos = 0;
    hsi.nMin = hsi.nPos = 0;
}

void KDocument::ScrollSettings(HWND hwnd, int width, int height)
{
    vsi.cbSize = sizeof(vsi);
    vsi.fMask = SIF_RANGE | SIF_PAGE | SIF_POS;
    vsi.nPage = height / yStep - 1;
    vsi.nMax = lines.size() - 1;
    if(vsi.nPage > vsi.nMax)
        vsi.nPos = vsi.nMin;
    vertRange = vsi.nMax - vsi.nMin + 1;
    SetScrollInfo(hwnd, SB_VERT, &vsi, TRUE);

    hsi.cbSize = sizeof(SCROLLINFO);
    hsi.fMask = SIF_RANGE | SIF_PAGE | SIF_POS;
    hsi.nPage = width / cxChar - 2;
    hsi.nMax = lineLenMax;
    if(hsi.nPage > hsi.nMax)
        hsi.nPos = hsi.nMin;
    horzRange = hsi.nMax - hsi.nMin + 1;
    SetScrollInfo(hwnd, SB_HORZ, &hsi, TRUE);
}

void KDocument::UpdateVscroll(HWND hwnd, int yInc)
{
    yInc = min(yInc, vertRange - (int)vsi.nPage - vsi.nPos);
    yInc = max(yInc, vsi.nMin - vsi.nPos);

    if(yInc)
    {
        ScrollWindow(hwnd, 0, -yStep * yInc, NULL, NULL);
        vsi.nPos += yInc;
        SetScrollInfo(hwnd, SB_VERT, &vsi, TRUE);
        InvalidateRect(hwnd, NULL, TRUE);
        UpdateWindow(hwnd);
    }
}

void KDocument::UpdateHscroll(HWND hwnd, int xInc)
{
    xInc = min(xInc, horzRange - (int)hsi.nPage - hsi.nPos);
    xInc = max(xInc, hsi.nMin - hsi.nPos);

    if(xInc)
    {
        ScrollWindow(hwnd, -cxChar * xInc, 0, NULL, NULL);
        hsi.nPos += xInc;
        SetScrollInfo(hwnd, SB_HORZ, &hsi, TRUE);
        InvalidateRect(hwnd, NULL, TRUE);
        UpdateWindow(hwnd);
    }
}

void KDocument::PutText(HWND hwnd, HDC hdc)
{
    RECT rect;
    GetClientRect(hwnd, &rect);
    rect.left += cxChar;
    rect.right -= cxChar;
    HRGN hRgn = CreateRectRgnIndirect(&rect);
    SelectClipRgn(hdc, hRgn);

    int x = cxChar * (hsi.nMin - hsi.nPos + 1);
    int y = yStep;
    int amountLines = lines.size();
    int iBeg = vsi.nPos;
    int iEnd = (vsi.nPos + vsi.nPage < amountLines)? vsi.nPos + vsi.nPage: amountLines;

    for(int i = iBeg; i < iEnd; ++i)
    {
        int iTabPos = lines[i], find('\t');
        if(-1 == iTabPos)
            TextOut(hdc, x, y, lines[i].c_str(), lines[i].size());
        else
            TabbedTextOut(hdc, x, y, lines[i].c_str(), lines[i].size(), 0, 0, x);
        y += yStep;
    }
    SelectClipRgn(hdc, NULL);
}

Последний раз редактировалось ACE Valery; 06.05.2012 в 11:39.
Асурус вне форума Ответить с цитированием
Старый 06.05.2012, 00:47   #4
Асурус
Пользователь
 
Регистрация: 17.03.2012
Сообщений: 15
По умолчанию

"KDocument.h"


Код:
#include <windows.h>
#include <vector>
#include <string>

using namespace std;

class KDocument
{
    public:
        BOOL Open(const char* file);
        void Initialize(LPTEXTMETRIC tm);
        void ScrollSettings(HWND hwnd, int width, int height);
        void UpdateHscroll(HWND hwnd, int xInc);
        void UpdateVscroll(HWND hwnd, int yInc);
        void PutText(HWND hwnd, HDC hdc);

        int cxChar;
        int yStep;
        int lineLenMax;
        SCROLLINFO vsi;
        int vertRange;
        SCROLLINFO hsi;
        int horzRange;

    private:
        vector<string> lines;
};

Последний раз редактировалось ACE Valery; 06.05.2012 в 11:40.
Асурус вне форума Ответить с цитированием
Старый 06.05.2012, 16:15   #5
Асурус
Пользователь
 
Регистрация: 17.03.2012
Сообщений: 15
По умолчанию

Кто может помочь, отзавитесь!!!
Асурус вне форума Ответить с цитированием
Старый 06.05.2012, 16:56   #6
SergeyCh
Пользователь
 
Регистрация: 22.04.2012
Сообщений: 27
По умолчанию Пример из книги С++ win32 api ...

Упрощенный пример вашей программы (оставил только определение класса в .h и реализацию ::Open() в .cpp) компилируется в VC++2010. Я не вижу, что кроме настроек проекта в Code::Blocks, может выдавать эту ошибку в данной структуре программы. Попробуйте сами в VC++.
SergeyCh вне форума Ответить с цитированием
Старый 07.05.2012, 15:50   #7
Асурус
Пользователь
 
Регистрация: 17.03.2012
Сообщений: 15
По умолчанию

Да, действительно работает, я ещё исправил ошибки... А кто-нибудь знает что не так с настройками или может я что-то забыл?
Асурус вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
win32 API.Visual Studio 2008.Создание проекта Win32 Aleksandr_Yanov Visual C++ 2 12.09.2010 13:09
Win32 API. VS2008. Как создать приложение win32 в vs2008? Aleksandr_Yanov Visual C++ 4 12.09.2010 00:59
Visual c++ (win32 api) выдаёт ошибку revaldo666 Visual C++ 5 07.07.2010 10:10
Visual c++ (win32 api) выдаёт ошибку revaldo666 Visual C++ 3 06.07.2010 18:58
Пример из книги,помогите найти ошибку. ANTI Win Api 4 04.06.2008 23:59