Есть у меня поток hThread, в который в качестве данных посылается структура myStruct, в которой есть поле isthreadfinished типа bool, которое показывает, завершился ли этот поток или нет.
Есть таймер ID_TIMER_1, которому соответствует функция CMyClass::OnTimer, которая выводит бегущую строку с интервалом в полсекунды и завершает вывод бегущей строки, как только поток hThread завершит свою работу:
void CMyClass::OnTimer(UINT uTime)
{
if (myStruct.isthreadfinished==true)
// если поток завершён
{
KillTimer(ID_TIMER_1);
timerTest = false;
timerCount = 0;
m_IDC_STATIC1.SetWindowTextA(" Расчёт выполнен");
CloseHandle(hThread);
// прочие действия;
return;
}
if (timerCount>=6) timerCount = 0;
if (timerCount==0) m_IDC_STATIC1.SetWindowTextA(" Расчёт выполняется");
if (timerCount==1) m_IDC_STATIC1.SetWindowTextA(" Расчёт выполняется .");
if (timerCount==2) m_IDC_STATIC1.SetWindowTextA(" Расчёт выполняется . .");
if (timerCount==3) m_IDC_STATIC1.SetWindowTextA(" Расчёт выполняется . . .");
if (timerCount==4) m_IDC_STATIC1.SetWindowTextA(" Расчёт выполняется . . . .");
if (timerCount==5) m_IDC_STATIC1.SetWindowTextA(" Расчёт выполняется . . . . .");
timerCount++;
}
В обычном случае, когда переменная m_IDC_STATIC1 относится к типу CStatic, всё работает нормально--бегущая строка чёрного цвета появляется на фоне стандартного диалога (оттенок серого цвета).
Но я захотел сменить цвет текста и цвет фона бегущей строки--чтобы эта строка была красного цвета, а цвет фона, на котором она появляется--зелёного цвета. Для этого я создал класс CMyStatic2 как потомок класса CStatic, в котором я переопределил метод OnPaint():
файл MyStatic2.h :
#include <afxwin.h>
class CMyStatic2 : public CStatic
{
protected:
void OnPaint();
DECLARE_MESSAGE_MAP()
public:
// открытые члены класса CMyStatic;
};
файл MyStatic2.cpp :
#include "stdafx.h"
#include "MyStatic2.h"
BEGIN_MESSAGE_MAP (CMyStatic2, CStatic)
ON_WM_PAINT()
END_MESSAGE_MAP()
void CMyStatic2::OnPaint()
{
const MSG *msg = GetCurrentMessage();
DefWindowProc(msg->message,msg->wParam,msg->lParam);
RECT rect;
CClient dc(this);
GetClientRect(&rect);
CBrush brush(RGB(0,128,0)); // зелёный цвет фона
dc.SelectObject(&brush);
dc.FillRect(&rect,&brush);
dc.SetTextColor(RGB(255,0,0)); // красный цвет текста
}
А переменную m_IDC_STATIC1 в классе CMyClass я сменил с типа CStatic на тип CMyStatic2 .
В результате чего у меня при запуске потока и таймера на одну секунду появляется статитческое поле зелёного цвета, а потом оно меняется на стандартный цвет диалога (оттенок серого цвета) и бегущая строка в этом статическом поле имеет чёрный цвет.
В чём причина этого? Как исправить эту ошибку--то есть как сделать так, чтобы это статическое поле всегда имело зелёный цвет, а бегущая строка в нём всегда имела красный цвет?
1613 г. = 2024 г.