Глюк VScroll в CEdit
От: AlexLux  
Дата: 18.11.04 08:44
Оценка:
Hello!

У меня в EditBoxe`е не работает вертикальный скролл! При прокрутке текста вновь появляемые строки накладываются на строки в окне, в результате текст смазывается. Как это можно исправить?

Заранее благодарен.
Re: Глюк VScroll в CEdit
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 18.11.04 08:54
Оценка:
Здравствуйте, AlexLux, Вы писали:

AL>У меня в EditBoxe`е не работает вертикальный скролл! При прокрутке текста вновь появляемые строки накладываются на строки в окне, в результате текст смазывается. Как это можно исправить?


А на код можно взглянуть?
[ posted via RSDN@Home 1.1.4 beta 3 r231, accompanied by Motorhead — Devils ]
- Искренне ваш, Поросенок Пафнутий
Re[2]: Глюк VScroll в CEdit
От: AlexLux  
Дата: 18.11.04 09:38
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>Здравствуйте, AlexLux, Вы писали:


AL>>У меня в EditBoxe`е не работает вертикальный скролл! При прокрутке текста вновь появляемые строки накладываются на строки в окне, в результате текст смазывается. Как это можно исправить?


SDB>А на код можно взглянуть?


Вот текст функции, добавляющей строки в EditBox:

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
LRESULT CReNamerDlg::OnDsplReslt(WPARAM wParam, LPARAM lParam)
{

    CString sNCount = "";
    
    sNCount.Format("%u", m_FileProc.m_uReplCntr);
    m_sInfoBox = m_FileProc.m_sCrntFilePath + 
                    " - " + sNCount + " replaces;\r\n";
    
    int selFirst = 0, selLast = 0;
    
    m_InfoBox1.SendMessage(EM_GETSEL, (WPARAM)&selFirst, (LPARAM)&selLast);
    
    if (selFirst == selLast)
    {
        selFirst = selLast = m_InfoBox1.GetWindowTextLength();
    }        
    m_InfoBox1.SendMessage(EM_SETSEL, selFirst, selLast);
    m_InfoBox1.SendMessage(EM_REPLACESEL, TRUE, (LONG)(LPCSTR)m_sInfoBox);
    
    return 1;
}
Re[3]: Глюк VScroll в CEdit
От: visual_wind  
Дата: 18.11.04 12:58
Оценка:
Здравствуйте, AlexLux, Вы писали:

AL>Здравствуйте, SchweinDeBurg, Вы писали:


SDB>>Здравствуйте, AlexLux, Вы писали:


AL>>>У меня в EditBoxe`е не работает вертикальный скролл! При прокрутке текста вновь появляемые строки накладываются на строки в окне, в результате текст смазывается. Как это можно исправить?


SDB>>А на код можно взглянуть?


AL>Вот текст функции, добавляющей строки в EditBox:


AL>
AL>//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
AL>LRESULT CReNamerDlg::OnDsplReslt(WPARAM wParam, LPARAM lParam)
AL>{

AL>    CString sNCount = "";
    
AL>    sNCount.Format("%u", m_FileProc.m_uReplCntr);
AL>    m_sInfoBox = m_FileProc.m_sCrntFilePath + 
AL>                    " - " + sNCount + " replaces;\r\n";
    
AL>    int selFirst = 0, selLast = 0;
    
AL>    m_InfoBox1.SendMessage(EM_GETSEL, (WPARAM)&selFirst, (LPARAM)&selLast);
    
AL>    if (selFirst == selLast)
AL>    {
AL>        selFirst = selLast = m_InfoBox1.GetWindowTextLength();
AL>    }        
AL>    m_InfoBox1.SendMessage(EM_SETSEL, selFirst, selLast);
AL>    m_InfoBox1.SendMessage(EM_REPLACESEL, TRUE, (LONG)(LPCSTR)m_sInfoBox);
    
AL>    return 1;
AL>}

AL>


Вот такой код у меня работает:


    CString m_sInfoBox = "12345\r\n";
    
    int selFirst = 0, selLast = 0;
    
    m_InfoBox1.SendMessage(EM_GETSEL, (WPARAM)&selFirst, (LPARAM)&selLast);
    
    if (selFirst == selLast)
    {
        selFirst = selLast = m_InfoBox1.GetWindowTextLength();
    }        
    m_InfoBox1.SendMessage(EM_SETSEL, selFirst, selLast);
    m_InfoBox1.SendMessage(EM_REPLACESEL, TRUE, (LONG)(LPCSTR)m_sInfoBox);


m_InfoBox1 я объявил как CEdit в хэдере и в OnInitDialog вызвал CEdit.Attach к окну на форме, у которого выставлены свойства Visible, TabStop, Multiline, VerticalScroll.
Re[4]: Глюк VScroll в CEdit
От: AlexLux  
Дата: 18.11.04 13:26
Оценка:
Здравствуйте, visual_wind, Вы писали:

_>Здравствуйте, AlexLux, Вы писали:


AL>>Здравствуйте, SchweinDeBurg, Вы писали:


SDB>>>Здравствуйте, AlexLux, Вы писали:


AL>>>>У меня в EditBoxe`е не работает вертикальный скролл! При прокрутке текста вновь появляемые строки накладываются на строки в окне, в результате текст смазывается. Как это можно исправить?


SDB>>>А на код можно взглянуть?


AL>>Вот текст функции, добавляющей строки в EditBox:


AL>>
AL>>//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
AL>>LRESULT CReNamerDlg::OnDsplReslt(WPARAM wParam, LPARAM lParam)
AL>>{

AL>>    CString sNCount = "";
    
AL>>    sNCount.Format("%u", m_FileProc.m_uReplCntr);
AL>>    m_sInfoBox = m_FileProc.m_sCrntFilePath + 
AL>>                    " - " + sNCount + " replaces;\r\n";
    
AL>>    int selFirst = 0, selLast = 0;
    
AL>>    m_InfoBox1.SendMessage(EM_GETSEL, (WPARAM)&selFirst, (LPARAM)&selLast);
    
AL>>    if (selFirst == selLast)
AL>>    {
AL>>        selFirst = selLast = m_InfoBox1.GetWindowTextLength();
AL>>    }        
AL>>    m_InfoBox1.SendMessage(EM_SETSEL, selFirst, selLast);
AL>>    m_InfoBox1.SendMessage(EM_REPLACESEL, TRUE, (LONG)(LPCSTR)m_sInfoBox);
    
AL>>    return 1;
AL>>}

AL>>


_>Вот такой код у меня работает:



_>
_>    CString m_sInfoBox = "12345\r\n";
    
_>    int selFirst = 0, selLast = 0;
    
_>    m_InfoBox1.SendMessage(EM_GETSEL, (WPARAM)&selFirst, (LPARAM)&selLast);
    
_>    if (selFirst == selLast)
_>    {
_>        selFirst = selLast = m_InfoBox1.GetWindowTextLength();
_>    }        
_>    m_InfoBox1.SendMessage(EM_SETSEL, selFirst, selLast);
_>    m_InfoBox1.SendMessage(EM_REPLACESEL, TRUE, (LONG)(LPCSTR)m_sInfoBox);
_>


_>m_InfoBox1 я объявил как CEdit в хэдере и в OnInitDialog вызвал CEdit.Attach к окну на форме, у которого выставлены свойства Visible, TabStop, Multiline, VerticalScroll.


А ты попробуй

CString m_sInfoBox = "12345\r\n54321\r\n";
    
    int selFirst = 0, selLast = 0;
    
    m_InfoBox1.SendMessage(EM_GETSEL, (WPARAM)&selFirst, (LPARAM)&selLast);
    
    if (selFirst == selLast)
    {
        selFirst = selLast = m_InfoBox1.GetWindowTextLength();
    }        
    m_InfoBox1.SendMessage(EM_SETSEL, selFirst, selLast);
    m_InfoBox1.SendMessage(EM_REPLACESEL, TRUE, (LONG)(LPCSTR)m_sInfoBox);
Re[5]: Глюк VScroll в CEdit
От: visual_wind  
Дата: 18.11.04 13:40
Оценка:
Здравствуйте, AlexLux, Вы писали:


_>>Вот такой код у меня работает:



_>>
_>>    CString m_sInfoBox = "12345\r\n";
    
_>>    int selFirst = 0, selLast = 0;
    
_>>    m_InfoBox1.SendMessage(EM_GETSEL, (WPARAM)&selFirst, (LPARAM)&selLast);
    
_>>    if (selFirst == selLast)
_>>    {
_>>        selFirst = selLast = m_InfoBox1.GetWindowTextLength();
_>>    }        
_>>    m_InfoBox1.SendMessage(EM_SETSEL, selFirst, selLast);
_>>    m_InfoBox1.SendMessage(EM_REPLACESEL, TRUE, (LONG)(LPCSTR)m_sInfoBox);
_>>


_>>m_InfoBox1 я объявил как CEdit в хэдере и в OnInitDialog вызвал CEdit.Attach к окну на форме, у которого выставлены свойства Visible, TabStop, Multiline, VerticalScroll.


AL>А ты попробуй


AL>
AL>CString m_sInfoBox = "12345\r\n54321\r\n";
    
AL>    int selFirst = 0, selLast = 0;
    
AL>    m_InfoBox1.SendMessage(EM_GETSEL, (WPARAM)&selFirst, (LPARAM)&selLast);
    
AL>    if (selFirst == selLast)
AL>    {
AL>        selFirst = selLast = m_InfoBox1.GetWindowTextLength();
AL>    }        
AL>    m_InfoBox1.SendMessage(EM_SETSEL, selFirst, selLast);
AL>    m_InfoBox1.SendMessage(EM_REPLACESEL, TRUE, (LONG)(LPCSTR)m_sInfoBox);

AL>


Попробовал, работает.

Может, Вам лучше привести более обширный кусок кода?
Re[6]: Глюк VScroll в CEdit
От: AlexLux  
Дата: 18.11.04 14:18
Оценка:
AL>>А ты попробуй

AL>>
AL>>CString m_sInfoBox = "12345\r\n54321\r\n";
    
AL>>    int selFirst = 0, selLast = 0;
    
AL>>    m_InfoBox1.SendMessage(EM_GETSEL, (WPARAM)&selFirst, (LPARAM)&selLast);
    
AL>>    if (selFirst == selLast)
AL>>    {
AL>>        selFirst = selLast = m_InfoBox1.GetWindowTextLength();
AL>>    }        
AL>>    m_InfoBox1.SendMessage(EM_SETSEL, selFirst, selLast);
AL>>    m_InfoBox1.SendMessage(EM_REPLACESEL, TRUE, (LONG)(LPCSTR)m_sInfoBox);

AL>>


_>Попробовал, работает.


_>Может, Вам лучше привести более обширный кусок кода?


Вот такой код наабивает EditBox ОТЛИЧАЮЩИМИСЯ строками. После этого у меня прокрутка текста скроллбаром вызывает его смазывание.
CString m_sInfoBox = "12345\r\n54321\r\n";
int selFirst = 0, selLast = 0;

for (UINT i=0; i<100; i++)    
{  
  m_InfoBox1.SendMessage(EM_GETSEL, (WPARAM)&selFirst, (LPARAM)&selLast);
  if (selFirst == selLast)
  {
     selFirst = selLast = m_InfoBox1.GetWindowTextLength();
  }         
  m_InfoBox1.SendMessage(EM_SETSEL, selFirst, selLast);
  m_InfoBox1.SendMessage(EM_REPLACESEL, TRUE, (LONG)(LPCSTR)m_sInfoBox);
}
Re[7]: Глюк VScroll в CEdit
От: visual_wind  
Дата: 18.11.04 14:28
Оценка:
Здравствуйте, AlexLux, Вы писали:

AL>>>А ты попробуй


AL>>>
AL>>>CString m_sInfoBox = "12345\r\n54321\r\n";
    
AL>>>    int selFirst = 0, selLast = 0;
    
AL>>>    m_InfoBox1.SendMessage(EM_GETSEL, (WPARAM)&selFirst, (LPARAM)&selLast);
    
AL>>>    if (selFirst == selLast)
AL>>>    {
AL>>>        selFirst = selLast = m_InfoBox1.GetWindowTextLength();
AL>>>    }        
AL>>>    m_InfoBox1.SendMessage(EM_SETSEL, selFirst, selLast);
AL>>>    m_InfoBox1.SendMessage(EM_REPLACESEL, TRUE, (LONG)(LPCSTR)m_sInfoBox);

AL>>>


_>>Попробовал, работает.


_>>Может, Вам лучше привести более обширный кусок кода?


AL>Вот такой код наабивает EditBox ОТЛИЧАЮЩИМИСЯ строками. После этого у меня прокрутка текста скроллбаром вызывает его смазывание.

AL>
AL>CString m_sInfoBox = "12345\r\n54321\r\n";
AL>int selFirst = 0, selLast = 0;

AL>for (UINT i=0; i<100; i++)    
AL>{  
AL>  m_InfoBox1.SendMessage(EM_GETSEL, (WPARAM)&selFirst, (LPARAM)&selLast);
AL>  if (selFirst == selLast)
AL>  {
AL>     selFirst = selLast = m_InfoBox1.GetWindowTextLength();
AL>  }         
AL>  m_InfoBox1.SendMessage(EM_SETSEL, selFirst, selLast);
AL>  m_InfoBox1.SendMessage(EM_REPLACESEL, TRUE, (LONG)(LPCSTR)m_sInfoBox);
AL>}

AL>


У меня все работает нормально.
Может, приведете подробности создания едита и место, в котором вызывается функция, в которой Вы заполняете едит?
Re[8]: Глюк VScroll в CEdit
От: AlexLux  
Дата: 18.11.04 15:11
Оценка:
Здравствуйте, visual_wind, Вы писали:

AL>>Вот такой код наабивает EditBox ОТЛИЧАЮЩИМИСЯ строками. После этого у меня прокрутка текста скроллбаром вызывает его смазывание.

AL>>
AL>>CString m_sInfoBox = "12345\r\n54321\r\n";
AL>>int selFirst = 0, selLast = 0;

AL>>for (UINT i=0; i<100; i++)    
AL>>{  
AL>>  m_InfoBox1.SendMessage(EM_GETSEL, (WPARAM)&selFirst, (LPARAM)&selLast);
AL>>  if (selFirst == selLast)
AL>>  {
AL>>     selFirst = selLast = m_InfoBox1.GetWindowTextLength();
AL>>  }         
AL>>  m_InfoBox1.SendMessage(EM_SETSEL, selFirst, selLast);
AL>>  m_InfoBox1.SendMessage(EM_REPLACESEL, TRUE, (LONG)(LPCSTR)m_sInfoBox);
AL>>}

AL>>


_>У меня все работает нормально.

_>Может, приведете подробности создания едита и место, в котором вызывается функция, в которой Вы заполняете едит?

Я использую EditBox c атрибутом ReadOnly, а для восстановления белого цвета использую обработчик

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
HBRUSH CReNamerDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    
    // TODO: Change any attributes of the DC here
    if (pWnd == &m_InfoBox1)
    {
        hbr = (HBRUSH)GetStockObject(WHITE_BRUSH);
        pDC->SetBkMode(TRANSPARENT);
    }

    // TODO: Return a different brush if the default is not desired
    return hbr;
}
Re[9]: Глюк VScroll в CEdit
От: visual_wind  
Дата: 18.11.04 15:36
Оценка:
Здравствуйте, AlexLux, Вы писали:

AL>Здравствуйте, visual_wind, Вы писали:


AL>>>Вот такой код наабивает EditBox ОТЛИЧАЮЩИМИСЯ строками. После этого у меня прокрутка текста скроллбаром вызывает его смазывание.

AL>>>
AL>>>CString m_sInfoBox = "12345\r\n54321\r\n";
AL>>>int selFirst = 0, selLast = 0;

AL>>>for (UINT i=0; i<100; i++)    
AL>>>{  
AL>>>  m_InfoBox1.SendMessage(EM_GETSEL, (WPARAM)&selFirst, (LPARAM)&selLast);
AL>>>  if (selFirst == selLast)
AL>>>  {
AL>>>     selFirst = selLast = m_InfoBox1.GetWindowTextLength();
AL>>>  }         
AL>>>  m_InfoBox1.SendMessage(EM_SETSEL, selFirst, selLast);
AL>>>  m_InfoBox1.SendMessage(EM_REPLACESEL, TRUE, (LONG)(LPCSTR)m_sInfoBox);
AL>>>}

AL>>>


_>>У меня все работает нормально.

_>>Может, приведете подробности создания едита и место, в котором вызывается функция, в которой Вы заполняете едит?

AL>Я использую EditBox c атрибутом ReadOnly, а для восстановления белого цвета использую обработчик


AL>
AL>//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
AL>HBRUSH CReNamerDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
AL>{
AL>    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    
AL>    // TODO: Change any attributes of the DC here
AL>    if (pWnd == &m_InfoBox1)
AL>    {
AL>        hbr = (HBRUSH)GetStockObject(WHITE_BRUSH);
        pDC->>SetBkMode(TRANSPARENT);
AL>    }

AL>    // TODO: Return a different brush if the default is not desired
AL>    return hbr;
AL>}
AL>



Наверное, все работает так, как и должно.

Из MSDN для функции SetBkColor
[msdn]
TRANSPARENT Background is not changed before drawing
[/msdn]

То есть при перерисовке едита его предыдущее содержимое остается и вызывает тот эффект, который Вы описали.

Может, Вам лучше указать, какого эффекта Вы хотели достичь, и мы подумаем над альтернативным способом его достижения?
Re[10]: Глюк VScroll в CEdit
От: AlexLux  
Дата: 19.11.04 08:27
Оценка:
Здравствуйте, visual_wind, Вы писали:


AL>>
AL>>//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
AL>>HBRUSH CReNamerDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
AL>>{
AL>>    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    
AL>>    // TODO: Change any attributes of the DC here
AL>>    if (pWnd == &m_InfoBox1)
AL>>    {
AL>>        hbr = (HBRUSH)GetStockObject(WHITE_BRUSH);
        pDC->>>SetBkMode(TRANSPARENT);
AL>>    }

AL>>    // TODO: Return a different brush if the default is not desired
AL>>    return hbr;
AL>>}
AL>>



_>Наверное, все работает так, как и должно.


_>Из MSDN для функции SetBkColor

_>[msdn]
_>TRANSPARENT Background is not changed before drawing
_>[/msdn]

_>То есть при перерисовке едита его предыдущее содержимое остается и вызывает тот эффект, который Вы описали.


_>Может, Вам лучше указать, какого эффекта Вы хотели достичь, и мы подумаем над альтернативным способом его достижения?


Hello!

Ура, Заработало! Спасибо за консалт. Я убрал из обработчика OnCtlColor вызов
SetBkMode(TRANSPARENT). Вот новый вариант OnCtlColor:

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
HBRUSH CReNamerDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
   HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    
   // TODO: Change any attributes of the DC here
   if (pWnd == &m_InfoBox1)
   {
        pDC->SetTextColor(0));
        pDC->SetBkColor(RGB(255,255,255));
        hbr = (HBRUSH)GetStockObject(WHITE_BRUSH);
   }

   // TODO: Return a different brush if the default is not desired
   return hbr;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.