Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по моей проге 
:(
    Опции темы
yngwie19
Дата 6.4.2009, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Привет вот моя мини прога
Код

#include <windows.h>
#include <windowsx.h>
#include <time.h>
#include "1.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
    LPSTR lpszClassName = "MainWindow";
    LPSTR lpszTitle = "Программа 12-5";
    hInst = hInstance;
    MSG msg;
    WNDCLASS wc = {0};

    // Инициализация и регистрация структуры wc класса MainWindow (первичного потока)
    wc.lpfnWndProc = WndProc;
    wc.hCursor = LoadCursor(NULL,IDC_ARROW);
    wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
    wc.hInstance = hInstance;
    wc.hbrBackground = GetStockBrush(LTGRAY_BRUSH);
    wc.lpszClassName = lpszClassName;
    RegisterClass(&wc);

    // Инициализация и регистрация структуры wc класса Thread1 (вторичного потока)
    wc.lpfnWndProc = Thread1WndProc;
    wc.lpszClassName = lpszThread1ClassName;
    RegisterClass(&wc);

    hwndMain = CreateWindowEx(WS_EX_TOPMOST,lpszClassName,lpszTitle,WS_BORDER | WS_SYSMENU,10,10,375,70,HWND_DESKTOP,NULL,hInstance,NULL);
    ShowWindow(hwndMain,SW_NORMAL);

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

// Описание функций главного окна (первичного потока)
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
    switch(msg)
    {
        HANDLE_MSG(hwnd,WM_CREATE,OnCreate);
        HANDLE_MSG(hwnd,WM_PAINT,OnPaint);
        HANDLE_MSG(hwnd,WM_TIMER,OnTimer);
        HANDLE_MSG(hwnd,WM_DESTROY,OnDestroy);
        default:
            return DefWindowProc(hwnd,msg,wParam,lParam);
    }
}

BOOL OnCreate(HWND hwnd,LPCREATESTRUCT)
{
    OnTime();
    SetTimer(hwnd,1000,0,NULL);

    // Создаем 3 потока
    CreateThread(NULL,0,Thread1,NULL,0,NULL);
    CreateThread(NULL,0,Thread2,NULL,0,NULL);
    
    return TRUE;
}

void OnPaint(HWND hwnd)
{
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hwnd,&ps);
    SetBkMode(hdc,TRANSPARENT);

    TextOut(hdc,5,0,lpszCurrentTime,strlen(lpszCurrentTime));

    EndPaint(hwnd,&ps);
}

void OnTimer(HWND,UINT)
{
    OnTime();
}

void OnDestroy(HWND)
{
    KillTimer(hwndMain,0);
    PostQuitMessage(0);
}

// Описание функций первисного потока
LRESULT CALLBACK Thread1WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
    return DefWindowProc(hwnd,msg,wParam,lParam);
}

DWORD WINAPI Thread1(LPVOID)
{
    MSG msg;
    HWND hwnd = CreateWindowEx(WS_EX_TOPMOST,lpszThread1ClassName,NULL,WS_BORDER | WS_POPUP,10,80,230,185,HWND_DESKTOP,NULL,hInst,NULL);
    ShowWindow(hwnd,SW_NORMAL);

    srand(time(NULL));
    SetTimer(hwnd,0,100,Thread1TimerProc);

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

void CALLBACK Thread1TimerProc(HWND hwnd,UINT,UINT,DWORD)
{
    char szText[] = "Набор данных"; // Текст в окне

    int y = 60 + rand() % 10;
    HDC hdc = GetDC(hwnd);

    SetBkMode(hdc,TRANSPARENT);
    TextOut(hdc,10,10,szText,strlen(szText));

    Rectangle(hdc,x,y,x+2,y+2);
    x+=2;
    if (x>=220)
    {
        x = 0;
        [color=red]InvalidateRect(hwnd,NULL,TRUE);[/color]
    }

    ReleaseDC(hwnd,hdc);
}

DWORD WINAPI Thread2(LPVOID)
{
    
    return 0;
}

// Другие функции
void OnTime()
{
    SYSTEMTIME st;
    GetLocalTime(&st);

    wsprintf(lpszCurrentTime,"%02d : %02d : %02d",st.wHour,st.wMinute,st.wSecond);
    InvalidateRect(hwndMain,NULL,TRUE);
}

Код

"1.h"

// Глобальные переменные
HINSTANCE hInst;
HWND hwndMain;
LPSTR lpszThread1ClassName = "Thread1";
char lpszCurrentTime[40];
int x;

// Прототипы функций главного окна (первичного потока)
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
BOOL OnCreate(HWND,LPCREATESTRUCT);
void OnPaint(HWND);
void OnTimer(HWND,UINT);
void OnDestroy(HWND);

// Прототипы функций первичного потока
DWORD WINAPI Thread1(LPVOID);
LRESULT CALLBACK Thread1WndProc(HWND,UINT,WPARAM,LPARAM);
void CALLBACK Thread1TimerProc(HWND,UINT,UINT,DWORD);

// Прототипы функций вторичного потока
DWORD WINAPI Thread2(LPVOID);


// Другие функции
void OnTime(void);


Код

"файл ресурсов"

#include <windows.h>
#include "resource.h"

Files DIALOG 120, 40, 69, 80
CAPTION "Поиск файлов"
{
    CONTROL "", ID_LIST,"LISTBOX",WS_VSCROLL | WS_BORDER,3,4,61,60
}

Код

"resource.h"
#define ID_LIST 100


подскажите Я не понимаю почему когда Я в функции Thread1TimerProc посылаю сообщение InvalidateRect() о перерисовке окна, то у меня окно и правда перерисовывается. Ведь сообщение WM_PAINT для этого потока обрабатывается по умолчанию. Как винда знает что у меня там нарисовано?

P.S: Если что в коде не понятно спрашивайте.

Это сообщение отредактировал(а) yngwie19 - 6.4.2009, 21:35
PM MAIL   Вверх
Andrey44
Дата 7.4.2009, 07:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



Что-то я вообще не увидел что-бы ты вызывал функцию Thread1TimerProc .
А перерисовывается потому что ты делаешь
Код

void OnTimer(HWND,UINT)
{
    OnTime();
}

а OnTime
Код

void OnTime()
{
    SYSTEMTIME st;
    GetLocalTime(&st);
    wsprintf(lpszCurrentTime,"%02d : %02d : %02d",st.wHour,st.wMinute,st.wSecond);
    InvalidateRect(hwndMain,NULL,TRUE);//а вот тут ты сам перерисовываешь свое окно!
}



--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
yngwie19
Дата 7.4.2009, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Цитата(Andrey44 @  7.4.2009,  07:16 Найти цитируемый пост)
Что-то я вообще не увидел что-бы ты вызывал функцию Thread1TimerProc .

110 строка, вызывается из строки 100.


Цитата(Andrey44 @  7.4.2009,  07:16 Найти цитируемый пост)
А перерисовывается потому что ты делаешь

здесь перерисовывается окно первичного потока, а Я имею ввиду потока Thread1
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1715 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.