wedagedara Ответов: 1

Как отправить сообщение в диалоговый класс


Привет,
Я новичок в MFC, я использую поток и хочу отправить сообщение в класс диалога, используя этот поток(ThreadProc), чтобы я мог вызвать функцию в классе диалога, используя этот поток. Пожалуйста, скажите мне код сообщения, чтобы использовать.(Метод SendMessage(?????????????))

Думаю, мне нужно отправить "ON_CBN_SELCHANGE", а id - "IDC_PType" (Пожалуйста, прочтите код)
Танки
Вот этот код

// UMKurunegalaDlg.cpp : implementation file
//

#include "stdafx.h"
#include "UMKurunegala.h"
#include "UMKurunegalaDlg.h"
#include "afxdialogex.h"



#ifdef _DEBUG
#define new DEBUG_NEW
#endif
static int Data_Of_Thread_1 = 1;
static HANDLE Handle_Of_Thread = 0;
int val = 0;

void ThreadProc(void *param)// *** The thread i am using
{
    int h=*((int*)param);

	SendMessage(?????????????????????????????????????????????????????);
    
    _endthread();
}
		/*DWORD WINAPI setBitThread(LPVOID lpParam) 
{	
	CUMKurunegalaDlg::OnCbnEditchangePtype();
    return 0; 
} */

// CAboutDlg dialog used for App About

class CAboutDlg : public CDialogEx
{
public:
	CAboutDlg();

// Dialog Data
	enum { IDD = IDD_ABOUTBOX };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

// Implementation
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// CUMKurunegalaDlg dialog




CUMKurunegalaDlg::CUMKurunegalaDlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(CUMKurunegalaDlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CUMKurunegalaDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, teststt, testt);
	DDX_Control(pDX, IDC_VType, vtypec);
	DDX_Control(pDX, IDC_pricest, pricest);
	DDX_Control(pDX, IDC_VBrand, vbrandc);
	DDX_Control(pDX, IDC_VModel, vmodelc);
	DDX_Control(pDX, IDC_VPart, vpartc);
	DDX_Control(pDX, IDC_PType, ptypec);

}

BEGIN_MESSAGE_MAP(CUMKurunegalaDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_CBN_SELCHANGE(IDC_VType, &CUMKurunegalaDlg::OnCbnSelchangeVtype)
	ON_CBN_SELCHANGE(IDC_VBrand, &CUMKurunegalaDlg::OnCbnSelchangeVbrand)
	ON_CBN_SELCHANGE(IDC_VModel, &CUMKurunegalaDlg::OnCbnSelchangeVmodel)
	ON_CBN_SELCHANGE(IDC_VPart, &CUMKurunegalaDlg::OnCbnSelchangeVpart)
	ON_CBN_SELCHANGE(IDC_PType, &CUMKurunegalaDlg::OnCbnSelchangePtype)
	ON_CBN_EDITCHANGE(IDC_PType, &CUMKurunegalaDlg::OnCbnEditchangePtype)
	ON_CBN_CLOSEUP(IDC_PType, &CUMKurunegalaDlg::OnCbnCloseupPtype)
END_MESSAGE_MAP()

xenotron

Простой ответ на ваш вопрос: Вы не можете отправить сообщение в класс.
Пожалуйста, прочтите учебник для начинающих C++, прежде чем переходить к продвинутым темам, таким как потоковая обработка и графический интерфейс, потому что в противном случае вы не сможете задать правильные вопросы и не сможете понять наши ответы.
PS: пожалуйста, не пишите дважды вопрос!

stib_markc

Простите меня, если я ошибаюсь, но я думаю, что он имел в виду, чтобы отправить сообщение в диалог из потока.

xenotron

- Да, я знаю. Но если он знает, в чем разница между классом и экземпляром, то он должен опубликовать какую-то другую часть кода. Вы просто не можете ответить на его вопрос, если он не знает основных терминов, и он хочет собрать что-то вместе, используя 2 относительно сложные вещи: threading и gui. В результате получается нечто, полное ошибок, если это вообще работает.
Я не думаю, что вы хотите начать учить его программировать на C++. Во всяком случае, мы ответили на его вопрос в другом посте, но он не мог этого понять.

wedagedara

ПРИВЕТ,
Я решил эту проблему, используя это в потоке
AfxGetApp()->m_pMainWnd->PostMessage(WM_APP+2,0,0);
и используя это в карте сообщений диалогового класса
ON_MESSAGE(WM_APP+2, &CUMKurunegalaDlg::testfunction)

Я просто хотел, чтобы вызвать функцию-член "UMKurunegalaDlg", используя какой-нить

Спасибо, что пытались мне помочь. (Я не хочу изучать c++ или время, чтобы изучить его, я просто хочу завершить свой дипломный проект, вот причина глупых вопросов, которые я задаю)
Хороший день

xenotron

Это нормально, PostMessage должен хорошо выполнять свою работу. Все еще не понимаю, почему это хорошо для вас или некоторых других учителей, если вы делаете что-то, чего на самом деле не понимаете. Но это выходит за рамки этой темы и вашей реальной задачи, это больше о том, как работают университеты...

Sergey Alexandrovich Kryukov

Вы, конечно, правы.
Моей первой реакцией было: "да ладно, это не совсем пустая болтовня" :-)
--СА

xenotron

ЛОЛ, это же умора! :-) Ты сделал мой день! :-)

Sergey Alexandrovich Kryukov

:-)

Richard MacCutchan

Я поддерживаю замечание пацторписти. Я бы также сказал, что вы неправильно используете диалог. Диалоговые окна-это всплывающие окна, используемые для получения информации от пользователя, а не для передачи информации между потоками. Диалог уже имеет встроенные методы для получения или установки данных, за которые он отвечает.

1 Ответов

Рейтинг:
12

stib_markc

Я предлагаю использовать PostThreadMessage вместо SendMessage, проверьте PostThreadMessage Демистифицировал[^] по причинам. Для получения документации см. http://msdn.microsoft.com/en-us/library/windows/desktop/ms644946%28v=vs.85%29.aspx[^]

И кстати, если вы хотите вызвать функцию вашего диалогового класса из вашего потока, то вам нужно отправить "this"(present dialog object reference) в качестве параметра в процедуру потока. Вы уверены, что делаете это? Потому что в коде вы бросаете свой lParam в int, который ставит меня в тупик. Когда вы вызываете свой threadproc, вам нужно отправить "this" как "lParam".
С помощью SendMessage код будет выглядеть примерно так :

 void ThreadProc(LPVOID lParam)
{
   CCurrentDialog* pDlg = (CCurrentDialog*)lParam;
   SendMessage(pDlg->m_hWnd,ON_CBN_SELCHANGE,NULL,NULL);
}


Вы можете использовать Почтовое сообщение[^] тоже.


wedagedara

Ваш ответ помог, спасибо

stib_markc

Добро пожаловать!