Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Kako napraviti dve kolone za tekst

[es] :: C/C++ programiranje :: Kako napraviti dve kolone za tekst

[ Pregleda: 4316 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

bradic
Goran Bradic
Beograd

Član broj: 51939
Poruke: 111
194.106.175.*



Profil

icon Kako napraviti dve kolone za tekst26.05.2006. u 13:57 - pre 217 meseci

1. Treba da u Visual C++ nacrtam jedan okvir (rectangle, ili neku kontrolu)

2. Zatim, da ubacim neki tekst u taj okvir

3. Na kraju - da taj okvir podelim u dve jednake kolone tako ta se tekst iz prve kolone prenosi (tj. nastavlja) u drugu kolonu. Ili, na primer, da zadam da taj okvir ima 3,4 5.. kolona, ali bitno mi je znaci da tekst bude u kolonama.

Kako?
 
Odgovor na temu

nikoladsp
nikola radovanovic
trenutno-developer
novi sad

Član broj: 5455
Poruke: 193
*.ADSL.neobee.net.



Profil

icon Re: Kako napraviti dve kolone za tekst26.05.2006. u 15:34 - pre 217 meseci
nisam bas siguran sta zelis da postignes? dali hoces na napravis celije (kao excel) u koje upisujes text, pa onda iscrtas preko njega neke linije tako da izgleda kao da imas text preko vise celija? takodje nisi rekao dali moras koristiti neku odredjenu biblioteku (npr. WIN API, an MFC)?

mozda ti ovo moze pomoci za pocetak (MFC je u pitanju):
MyBorder.h

Code:

#ifndef __MYBORDER_H__
#define __MYBORDER_H__

class CMyBorder : public CStatic
{
protected:

    CClientDC* m_pDC;

public:

// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CMyBorder)
    //}}AFX_VIRTUAL

public:

    CMyBorder();
    virtual ~CMyBorder();

    void HalfeIt();
    void AttachParent(CWnd*pWnd);

    BOOL DrawText(int x, int y, LPCSTR pszText, int nCount);
    virtual BOOL DrawCenteredText(LPCSTR pszText);

protected:

    int GetTextLength(LPCSTR pszText) const;

protected:
    //{{AFX_MSG(CMyBorder)
    //}}AFX_MSG

    DECLARE_MESSAGE_MAP()
};

#endif


MyBorder.cpp

Code:

#include "stdafx.h"
#include "MyBorder.h"

CMyBorder::CMyBorder()
{
    m_pDC = NULL;
}

CMyBorder::~CMyBorder()
{
    if (m_pDC != NULL)
    {
        delete m_pDC;
    }
}

int CMyBorder::GetTextLength(LPCSTR pszText) const
{
    return (pszText != "") ? strlen(pszText) : 0;
}

void CMyBorder::AttachParent(CWnd *pWnd)
{
    if (m_pDC == NULL)
    {
        m_pDC = new CClientDC(this);
    }
}

BOOL CMyBorder::DrawText(int x, int y, LPCSTR pszText, int nCount)
{
    m_pDC->SetBkColor(RGB(255,0,0));

    return m_pDC->TextOut(x, y, pszText, nCount);
}

BOOL CMyBorder::DrawCenteredText(LPCSTR pszText)
{
    ASSERT(m_pDC);

    BOOL bRetVal = FALSE;

    CRect rcThis;
    GetClientRect(&rcThis);

    TEXTMETRIC tm;
    m_pDC->GetTextMetrics(&tm);

    int nTextLength = GetTextLength(pszText);
    int nTextWidth = tm.tmAveCharWidth * nTextLength;
    int nTextHeigth = tm.tmHeight;

    int x = ((rcThis.Width() - nTextWidth) >> 1);
    int y = ((rcThis.Height() - nTextHeigth) >> 1);

    m_pDC->SetBkMode(TRANSPARENT);

    HalfeIt();

    bRetVal = m_pDC->TextOut(x, y, pszText, nTextLength);

    return bRetVal;
}

void CMyBorder::HalfeIt()
{
    CRect rcThis;
    GetClientRect(&rcThis);

    int nWidth = (rcThis.Width() >> 1);
    int nHeight = rcThis.Height();

    m_pDC->MoveTo(nWidth, 0);

    m_pDC->LineTo(nWidth, nHeight);
}

BEGIN_MESSAGE_MAP(CMyBorder, CStatic)
    //{{AFX_MSG_MAP(CMyBorder)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()


onda dodas jednu STATIC kontrolu u dijalog, i dodas joj promenljivu m_ctrlMyBorder koja je tipa CMyBorder (najlakse sa vizardom) , u OnInitDijalog na kraju f-je dodas

Code:
m_ctrlMyBorder.AttachParent(this);


i napravis f-ju koja se poziva na stisak dugmeta:

Code:

CString str = "Ovo je neki shatro text...";
m_ctrlMyBorder.DrawCenteredText(str);


nadam se da ti je ovo kao neka startna pomoc dovoljno.

pozdrav.

ja sam panker sa diplomom kod moje mame...
 
Odgovor na temu

bradic
Goran Bradic
Beograd

Član broj: 51939
Poruke: 111
194.106.175.*



Profil

icon Re: Kako napraviti dve kolone za tekst28.05.2006. u 15:08 - pre 217 meseci
Nije mi bas najjasnije, posto prvi put radim ovako nesto.


1. Napravio sam Dialog-based aplikaciju

2. Nazvao sam je MyBorder

3. Umesto MyBorder.h koji je Wizard napravio ubacio sam tvoj fajl

4. Umesto MyBorder.cpp koji je Wizard napravio ubacio sam tvoj fajl

5. Ali, kad pokrenem aplikaciju javlja mi da nije deklarisan IDR_MAINFRAME koji mi je napravio Wizard (MyBorderDlg)



Verovatno gresim u implementiranju ovih tvojih fajlova a u Visual C++ sam Pocetnik+.



[Ovu poruku je menjao bradic dana 30.05.2006. u 19:46 GMT+1]
 
Odgovor na temu

nikoladsp
nikola radovanovic
trenutno-developer
novi sad

Član broj: 5455
Poruke: 193
*.ADSL.neobee.net.



Profil

icon Re: Kako napraviti dve kolone za tekst05.06.2006. u 15:17 - pre 217 meseci
probaj ovako:

MYCOLUMNCTRL.h

Code:

#ifndef __MYCOLUMNCTRL_H__
#define __MYCOLUMNCTRL_H__

// alignments
typedef enum {eLEFT = 0, eCENTER, eRIGHT} enAlignment;

// defaults
#define DEF_WIDTH            100
#define DEF_HEIGHT            100
#define DEF_COLUMN_NUMS        3
#define DEF_COLUMN_SPACING    30
#define DEF_ALIGNMENT       eLEFT 
#define DEF_TOP_SPACING        5
    
class CMyColumnCtrl : public CStatic
{

protected:

    const int m_nColumns;
    int m_nSpacing;
    int m_nWidth;
    int m_nHeight;
    int m_nAlignment;

    CRichEditCtrl** m_pColumns;

public:
    void InitCtrl();
    int GetAlignment() const;
    void SetAlignment(int nAlignment);

    CMyColumnCtrl(int nWidth = DEF_WIDTH, int nHeight = DEF_HEIGHT, int nSpacing = DEF_COLUMN_SPACING, int nColumns = DEF_COLUMN_NUMS);
    virtual ~CMyColumnCtrl();

protected:

    void Create();
    void Destroy();

// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CMyColumnCtrl)
    public:
    protected:
    //}}AFX_VIRTUAL

// Generated message map functions
protected:
    void SetAlignments();

    //{{AFX_MSG(CMyColumnCtrl)
    //}}AFX_MSG

    DECLARE_MESSAGE_MAP()
};

#endif 



MYCOLUMNCTRL.cpp

Code:

#include "StdAfx.h"
#include "MyColumnCtrl.h"

CMyColumnCtrl::CMyColumnCtrl(int nWidth, int nHeight, int nSpacing, int nColumns)
    :m_nColumns(nColumns)
{
    ASSERT(m_nColumns);

    m_nAlignment = DEF_ALIGNMENT;
    m_pColumns = NULL;
    m_nWidth = nWidth;
    m_nHeight = nHeight, 
    m_nSpacing = nSpacing;
}

CMyColumnCtrl::~CMyColumnCtrl()
{
    Destroy();    
}

BEGIN_MESSAGE_MAP(CMyColumnCtrl, CStatic)
    //{{AFX_MSG_MAP(CMyColumnCtrl)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CMyColumnCtrl::Create()
{
    if (m_pColumns == NULL)
    {
        m_pColumns = new CRichEditCtrl* [m_nColumns];


        RECT rcParent;
        ::GetWindowRect(this->m_hWnd, &rcParent);

        CRect rcThis;
        this->GetClientRect(&rcThis);
            
        int nWidth = (rcThis.Width() - (m_nColumns + 1) * m_nSpacing) / m_nColumns;
        int nHeight = rcThis.Height() - (DEF_TOP_SPACING << 1);

        for (int i=0; i < m_nColumns; i++)
        {
            int nLeft = rcParent.left + m_nSpacing * (i + 1) + i * nWidth;
            const int nWinMenuHeight = GetSystemMetrics(SM_CYMENU);
            int nTop = rcParent.top + DEF_TOP_SPACING - nWinMenuHeight;

            CRect rcPlace(nLeft, nTop, nLeft + nWidth, nTop + nHeight);

            m_pColumns[i] = new CRichEditCtrl() ;
            m_pColumns[i]->Create(WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_AUTOVSCROLL | WS_BORDER | 
                                  WS_VSCROLL | WS_TABSTOP, rcPlace, this->GetParent(), 1);

        }

        SetAlignment(m_nAlignment);
    }
}

void CMyColumnCtrl::Destroy()
{
    if (m_pColumns != NULL)
    {
        for (int i=0; i < m_nColumns; i++)
        {
            CRichEditCtrl* pColumn = m_pColumns[i];

            if ( pColumn != NULL)
            {
                delete pColumn;
                pColumn = NULL;
            }
        }
    }
}

void CMyColumnCtrl::SetAlignment(int nAlignment)
{
    m_nAlignment = nAlignment;

    SetAlignments();
    UpdateData(FALSE);
}

int CMyColumnCtrl::GetAlignment() const
{
    return m_nAlignment;
}

void CMyColumnCtrl::SetAlignments()
{
    if (m_pColumns != NULL)
    {
        for (int i=0; i < m_nColumns; i++)
        {
            CRichEditCtrl* pColumn = m_pColumns[i];

            // TODO implement alignment of each CRichEditCtrl
            if (pColumn != NULL)
            {
                
            
                PARAFORMAT pf;
                WORD dwAlignment;

                pf.cbSize = sizeof(PARAFORMAT);
                pf.dwMask = PFM_ALIGNMENT;

                switch (m_nAlignment)
                {
                case eLEFT:
                    dwAlignment = PFA_LEFT;
                    break;
                case eCENTER:
                    dwAlignment = PFA_CENTER;
                    break;
                case eRIGHT:
                    dwAlignment = PFA_RIGHT;
                    break;
                default:
                    break;
                }

                pf.wAlignment = dwAlignment;

                pColumn->SetParaFormat(pf);
            }
        }
    }
}

void CMyColumnCtrl::InitCtrl()
{
    Create();
}


sada dodas jednu static-text kontrolu, das joj neki id drugaciji od IDC_STATIC, recimo IDC_MYCTRL i sa kontrol vizardom (CTRL+W) dodas joj promenljivu tipa CMyColumnCtrl. U OnInitDlalog, pred kraj f-je dodaj

Code:

m_ctrlColumns.InitCtrl();


gde je naravno

Code:

CMyColumnCtrl m_ctrlColumns; // ovo u *.h fajlu tvog dijaloga 


cheers.
ja sam panker sa diplomom kod moje mame...
 
Odgovor na temu

[es] :: C/C++ programiranje :: Kako napraviti dve kolone za tekst

[ Pregleda: 4316 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.