[动态][创建][ActiveX]动态创建ActiveX的问题
09月 17th, 2008 by admin
Posted in VC/MFC | No Comments »
ATL下面想动态创建一个ActiveX,主要代码如下:
HRESULT hr;
RECT rc;
GetClientRect(&rc);
LPOLESTR pstrbrowserid;
StringFromCLSID(IID_ICortona, &pstrbrowserid);
CComBSTR bstrbrowser(pstrbrowserid);
CoTaskMemFree(pstrbrowserid);
HWND hwnd;
hwnd = m_axNestedControl.Create(m_hWnd, rc, 0, WS_CHILD | WS_VISIBLE);
hr = m_axNestedControl.CreateControlEx((LPCOLESTR)bstrbrowser, NULL, NULL, reinterpret_cast <IUnknown**>(&m_pICortona));
调试到这里来时hr显示“没有注册类别”,可我明明已经注册了这个ActiveX啊,GUID也没错,会是什么问题呢?
我把StringFromCLSID换成了StringFromIID,结果还是一样,hr显示“没有注册类别”,还有别的什么问题吗?
已经说了,要用CLSID,不能用IID
[文档][创建][窗口]请问多文档怎样创建多个子窗口
09月 15th, 2008 by admin
Posted in VC/MFC | No Comments »
感觉自己太菜了,怎么连这个也不会呢?很郁闷。
就只是想实现一开始就有四个子窗口以“田”字型排列,并且这四个窗口是同一个窗口类实例化的。
请问怎么做?谢谢大家!
感谢tescaxl的帮助!添加三次OnFileNew()后,果然一开始就出现四个子窗口了!但请问“再发送MDI_TITLE给框架窗口,或调用框架类MDITitle()”的用意是改变子窗口的标题吗?请问具体怎么写?我随便猜着写结果出错了:
“error C2065: “MDI_TITLE”: 未声明的标识符”
[创建][win32][编译]创建win32 DLL编译出错不知道哪里出的错
09月 15th, 2008 by admin
Posted in VC/MFC | No Comments »
用向导穿件的win32 DLL
DLL头文件如下(红色部分为自己加的):
#ifdef SYSTIME_EXPORTS
#define SYSTIME_API __declspec(dllexport)
#else
#define SYSTIME_API __declspec(dllimport)
#endif
// This class is exported from the SysTime.dll
class SYSTIME_API CSysTime {
public:
CSysTime(void);
// TODO: add your methods here.
};
extern SYSTIME_API int nSysTime;
SYSTIME_API int fnSysTime(void);
SYSTIME_API void GetTime( SYSTEMTIME* lpSystemTime );
DLL源文件如下(红色部分为自己加的):
#include "stdafx.h"
#include "SysTime.h"
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
// This is an example of an exported variable
SYSTIME_API int nSysTime=0;
// This is an example of an exported function.
SYSTIME_API int fnSysTime(void)
{
return 42;
}
// This is the constructor of a class that has been exported.
// see SysTime.h for the class definition
CSysTime::CSysTime()
{
return;
}
SYSTIME_API void GetTime( SYSTEMTIME* lpSystemTime )
{
GetLocalTime( lpSystemTime );
}
编译出现如下信息:
:SysTimeSysTime.cpp(25) : error C2491: 'nSysTime' : definition of dllimport data not allowed
H:SysTimeSysTime.cpp(29) : error C2491: 'fnSysTime' : definition of dllimport function not allowed
H:SysTimeSysTime.cpp(36) : warning C4273: 'CSysTime::CSysTime' : inconsistent dll linkage. dllexport assumed.
H:SysTimeSysTime.cpp(41) : error C2491: 'GetTime' : definition of dllimport function not allowed
Error executing xicl6.exe.
大家帮我看看到底哪里出现问题了,我是照书上敲的啊。
在最开头加上
#define SYSTIME_EXPORTS
或者在项目设置的预处理器定义里加上 SYSTIME_EXPORTS
谢谢lew0002 ,十分感谢
[有趣][创建][窗口]一个比较有趣的问题创建出的窗口是白色的。
09月 10th, 2008 by admin
Posted in VC/MFC | No Comments »
以下是我找到的一段CInputBox的代码,功能呢类似于VB的InputBox函数。但美中不足是创建出的窗口是白色的,这是为什么呢?难道
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW); 这一句没有起作用吗?
附全部代码:
——-cinputbox.h ————————————————-
// InputBox.h: interface for the CInputBox class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_INPUTBOX_H__0BE6B01B_C74A_45FE_AF35_D6E8E4B65A1B__INCLUDED_)
#define AFX_INPUTBOX_H__0BE6B01B_C74A_45FE_AF35_D6E8E4B65A1B__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#define INPUTBOX_WIDTH 400
#define INPUTBOX_HEIGHT 125
/*
Author : mah
Date : 13.06.2002
Description :
similar to Visual Basic InputBox
*/
class CInputBox
{
static HFONT m_hFont;
static HWND m_hWndInputBox;
static HWND m_hWndParent;
static HWND m_hWndEdit;
static HWND m_hWndOK;
static HWND m_hWndCancel;
static HWND m_hWndPrompt;
static HINSTANCE m_hInst;
static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
public:
// text from InputBox
LPTSTR Text;
BOOL DoModal(LPCTSTR szCaption, LPCTSTR szPrompt);
CInputBox(HWND hWndParent);
virtual ~CInputBox();
};
#endif // !defined(AFX_INPUTBOX_H__0BE6B01B_C74A_45FE_AF35_D6E8E4B65A1B__INCLUDED_)
——————————————————————–
——-cinputbox.cpp————————————————
#include "stdafx.h"
#include "CInputBox.h"
HFONT CInputBox::m_hFont = NULL;
HWND CInputBox::m_hWndInputBox = NULL;
HWND CInputBox::m_hWndParent = NULL;
HWND CInputBox::m_hWndEdit = NULL;
HWND CInputBox::m_hWndOK = NULL;
HWND CInputBox::m_hWndCancel = NULL;
HWND CInputBox::m_hWndPrompt = NULL;
HINSTANCE CInputBox::m_hInst = NULL;
//////////////////////////////////////////////////////////////////////
// CInputBox Class
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
/*
Author : mah
Date : 13.06.2002
Description :
Constructs window class InputBox
*/
CInputBox::CInputBox(HWND hWndParent)
{
HINSTANCE hInst = GetModuleHandle(NULL);
WNDCLASSEX wcex;
if (!GetClassInfoEx(hInst, "InputBox", &wcex))
{
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInst;
wcex.hIcon = NULL;//LoadIcon(hInst, (LPCTSTR)IDI_MYINPUTBOX);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = "InputBox";
wcex.hIconSm = NULL;
if (RegisterClassEx(&wcex) == 0)
MessageBox(NULL, "Can't create CInputBox!", "Error", MB_OK);
}
m_hWndParent = hWndParent;
Text = NULL;
}
CInputBox::~CInputBox()
{
if (Text) delete[] Text;
}
/*
Author : mah
Date : 13.06.2002
Description : Window procedure
*/
LRESULT CALLBACK CInputBox::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
LOGFONT lfont;
switch (message)
{
case WM_CREATE:
// font
memset(&lfont, 0, sizeof(lfont));
lstrcpy(lfont.lfFaceName, _T("Arial"));
lfont.lfHeight = 16;
lfont.lfWeight = FW_NORMAL;//FW_BOLD;
lfont.lfItalic = FALSE;
lfont.lfCharSet = DEFAULT_CHARSET;
lfont.lfOutPrecision = OUT_DEFAULT_PRECIS;
lfont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
lfont.lfQuality = DEFAULT_QUALITY;
lfont.lfPitchAndFamily = DEFAULT_PITCH;
m_hFont = CreateFontIndirect(&lfont);
m_hInst = GetModuleHandle(NULL);
// creating Edit
m_hWndEdit = CreateWindowEx(WS_EX_STATICEDGE,
"edit","",
WS_VISIBLE | WS_CHILD | WS_TABSTOP | ES_AUTOHSCROLL,
5, INPUTBOX_HEIGHT - 50, INPUTBOX_WIDTH - 16, 20,
hWnd,
NULL,
m_hInst,
NULL);
// setting font
SendMessage(m_hWndEdit, WM_SETFONT, (WPARAM)m_hFont, 0);
// button OK
m_hWndOK = CreateWindowEx(WS_EX_STATICEDGE,
"button","OK",
WS_VISIBLE | WS_CHILD | WS_TABSTOP,
INPUTBOX_WIDTH - 100, 10, 90, 25,
hWnd,
NULL,
m_hInst,
NULL);
// setting font
SendMessage(m_hWndOK, WM_SETFONT, (WPARAM)m_hFont, 0);
// button Cancel
m_hWndCancel = CreateWindowEx(WS_EX_STATICEDGE,
"button","Cancel",
WS_VISIBLE | WS_CHILD | WS_TABSTOP,
INPUTBOX_WIDTH - 100, 40, 90, 25,
hWnd,
NULL,
m_hInst,
NULL);
// setting font
SendMessage(m_hWndCancel, WM_SETFONT, (WPARAM)m_hFont, 0);
// static Propmpt
m_hWndPrompt = CreateWindowEx(WS_EX_STATICEDGE,
"static","",
WS_VISIBLE | WS_CHILD,
5, 10, INPUTBOX_WIDTH - 110, INPUTBOX_HEIGHT - 70,
hWnd,
NULL,
m_hInst,
NULL);
// setting font
SendMessage(m_hWndPrompt, WM_SETFONT, (WPARAM)m_hFont, 0);
SetFocus(m_hWndEdit);
break;
case WM_DESTROY:
DeleteObject(m_hFont);
EnableWindow(m_hWndParent, TRUE);
SetForegroundWindow(m_hWndParent);
DestroyWindow(hWnd);
PostQuitMessage(0);
break;
case WM_COMMAND:
switch (HIWORD(wParam))
{
case BN_CLICKED:
if ((HWND)lParam == m_hWndOK)
PostMessage(m_hWndInputBox, WM_KEYDOWN, VK_RETURN, 0);
if ((HWND)lParam == m_hWndCancel)
PostMessage(m_hWndInputBox, WM_KEYDOWN, VK_ESCAPE, 0);
break;
}
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
/*
Author : mah
Date : 13.06.2002
Description :
Constructs InputBox window
*/
BOOL CInputBox::DoModal(LPCTSTR szCaption, LPCTSTR szPrompt)
{
RECT r;
GetWindowRect(GetDesktopWindow(), &r);
m_hWndInputBox = CreateWindowEx(WS_EX_TOOLWINDOW,
"InputBox",
szCaption,
WS_POPUPWINDOW | WS_CAPTION | WS_TABSTOP,
(r.right - INPUTBOX_WIDTH) / 2, (r.bottom - INPUTBOX_HEIGHT) / 2,
INPUTBOX_WIDTH, INPUTBOX_HEIGHT,
m_hWndParent,
NULL,
m_hInst,
NULL);
if(m_hWndInputBox == NULL)
return FALSE;
SetWindowText(m_hWndPrompt, szPrompt);
SetForegroundWindow(m_hWndInputBox);
EnableWindow(m_hWndParent, FALSE);
ShowWindow(m_hWndInputBox, SW_SHOW);
UpdateWindow(m_hWndInputBox);
BOOL ret = 0;
MSG msg;
HWND hWndFocused;
while (GetMessage(&msg, NULL, 0, 0))
{
if (msg.message == WM_KEYDOWN)
{
if (msg.wParam == VK_ESCAPE)
{
SendMessage(m_hWndInputBox, WM_DESTROY, 0, 0);
ret = 0;
}
if (msg.wParam == VK_RETURN)
{
int nCount = GetWindowTextLength(m_hWndEdit);
nCount++;
if (Text)
{
delete[] Text;
Text = NULL;
}
Text = new TCHAR[nCount];
GetWindowText(m_hWndEdit, Text, nCount);
SendMessage(m_hWndInputBox, WM_DESTROY, 0, 0);
ret = 1;
}
if (msg.wParam == VK_TAB)
{
hWndFocused = GetFocus();
if (hWndFocused == m_hWndEdit) SetFocus(m_hWndOK);
if (hWndFocused == m_hWndOK) SetFocus(m_hWndCancel);
if (hWndFocused == m_hWndCancel) SetFocus(m_hWndEdit);
}
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return ret;
}
——————————————————————–
——调用示例——————————————————
CInputBox cib(this->m_hWnd);
cib.DoModal("haha","hehe");
——————————————————————–
搞这么复杂,用对话框不就行了?
响应 WM_ERASEBKGND 自己画
case WM_ERASEBKGND:
lResult = (BOOL)OnEraseBkgnd((HDC )wParam);
break;
COLOR_WINDOW在XP系统中就是白色的,对话框背景用COLOR_3DSHADOW。
color_window就是窗口的颜色啊,一般就是白色……..
一般不需要指定这个颜色,缺省就可以了………
其实这个以前做过,不过效果一般。
可以在需要抓背景的时候,把显示透明窗口的窗口移出桌面,如移到(1000,2000)等。然后抓背景,再把窗口移回来就可以了。
[创建][ISAPI][扩展]用vc创建一个ISAPI扩展可以在vc程序中调用吗
09月 5th, 2008 by admin
Posted in VC/MFC | No Comments »
vc中的dialog程序中可以调用一个用vc开发的ISAPI扩展dll吗?
在线等…..
谢谢
能具体说下吗?如果采用com,可是它没有接口啊
我也有同样的问题!
ISAPI应该是在IIS里面运行的,`dialog`希望怎么调用他?通过http方式还是通过普通DLL方式?
普通的应用应该是写好后把DLL给ASP调用
不能采用com的方式吧,我认为只能在dialog加上IE控件或者其他网络空间,通过http调用吧。ISAPI应该是专门为IIS的一种扩展吧
[程序][创建][CArchive]请问程序创建CArchive对象之前必须要创建一个CFile对象与之相关联吗
09月 5th, 2008 by admin
Posted in VC/MFC | No Comments »
我看到网上有这么一段话:
在创建CArchive类对象前,必须创建一个CFile对象,并将其与CArchive对象相关联。在文档/视图结构的实现中,这一步将由框架在调用Serialize()函数前自动完成。
在使用AppWizard创建的文档中,当单击打开或保存菜单项时,程序将自动创建一个指定文件的CFile对象,再创建一个指向该对象的CArchive对象,将二者都置为相同状态——打开或保存,然后再调用文档类Serialize()函数,将数据写入CArchive对象或从CArchive对象读取数据。当Serialize()函数完成工作后,框架将先后自动销毁CArchive对象和CFile对象。
我不理解的是:
1 程序自动创建的CFile对象名称是什么?
2 在哪一步将二者置为相同的状态呢?
还有,我新建了一个派生自CObject的CStroke类,我调用CStroke类的Serialize函数,参数CArchive& ar指向的是哪一个CFile啊?
非常感谢!
CFile需要你自己创建一个,打开文件时需要指定打开标志,比如只读、读写等等,像下面这样:
CFile file(_T("c:\abc.dat"), CFile::modeRead);
CArchive也是一样的,在构造函数中就要指定读写标志,比如:
CArchive ar(&file, CArchive::load);
CFile::modeRead跟CArchive::load对应,CFile::modeWrite跟CArchive::store对应
序列化是CObject类的一个特性,派生于CObject的类,加上对应宏即可实现序列化。
这个和你要对这个类对象进行序列化是两回事,对这个类对象序列化时才要用到CArchive和CFile,这时序列化时框架自然会调用你实现的Serialize函数,对对象的数据进行保存。
创建序列化累的时候不需要CFile。
MSDN上对序列化类有详细说明。
[线程][CreateThread][创建]主线程用CreateThread()创建一个子线程。子线程还在运行时主线程结束运行。这时子线程会继续运行么主线程还存在么所在进程会如何
08月 31st, 2008 by admin
Posted in VC/MFC | No Comments »
主线程用CreateThread()创建一个子线程。子线程还在运行时,主线程结束运行。这时子线程会继续运行么?主线程还存在么?所在进程会如何?
如果不是主线程,只是一个普通的父线程,他结束时,他的子线程会结束么?
只有启动进程时的主线程才是老大,其它子子孙孙都是子线程,没有区别,所以这些线程中的任何一个退出都不会影响别的线程。
但是为了安全性考虑,最好在结束主线程时把该结束的子线程都结束了,防止内存泄露和不必要的麻烦。
[创建][类似][MessageBox]怎么创建一个类似于MessageBox的对话框
08月 31st, 2008 by admin
Posted in VC/MFC | No Comments »
rt,我要创建一个类似MessageBox的对话框,因为我要改变他的"确认"、"取消"文本。请问应该怎么做?
前面哪些警告的标志都要有,跟MessageBox一样。
自己创建一个对话框和一个对话框类,
需要时就DoModal就好了…
建一个对话框,然后加上那些想要的按钮,找一个类似的图标贴上,响应消息就可以了!
那怎么贴入图标啊?
See http://topic.csdn.net/u/20080714/13/ebc5b6d5-34a5-4540-aefe-ad9579527c35.html
有点看不明白啊,呵呵,我不许用输入框,能不能给我简单点的例子啊~
可以这样做,你自己做一个类似的对话框然后为它创建一个类,并添加相关函数来实现对参数"字符串"的处理.
对于不同类型的对话框你可以同样去实现,在最后再建一个类来实现对不同对话框的调用就可以了呀!!
恩,谢谢大家,现在实现了,但能告诉我怎么在启动模态对话框的时候加入声音提示么,比如AfxMessageBox的警告声音?
真巧,这几天刚做了一个,送给你吧!记得给分哦!
#include <mmsystem.h>
class CSound
{
public:
CSound();
virtual ~CSound();
bool playBackGroundMusicSound(CString,CString);
bool playTippingMusicSound(CString,CString);
public:
MCIDEVICEID m_MCIDeviceID; //播放提示音的变量
MCI_OPEN_PARMS mciOpenParms; //此变量定义为全局变量
MCI_PLAY_PARMS mciPlayParms; //times为控制背景音乐中间不中断的变量
DWORD dwError; //
int times; //播放背景音乐及提示音的变量
};
//播放提示音的函数
bool CSound::playTippingMusicSound(CString fileName,CString fileNameExtension)
{
if(fileNameExtension=="wav" ¦ ¦fileNameExtension=="wave" ¦ ¦fileNameExtension=="WAV" ¦ ¦fileNameExtension=="WAVE")
mciOpenParms.lpstrDeviceType="waveaudio";
else if(fileNameExtension=="mid" ¦ ¦fileNameExtension=="midi" ¦ ¦fileNameExtension=="MID" ¦ ¦fileNameExtension=="MIDI")
mciOpenParms.lpstrDeviceType="sequencer";
else
mciOpenParms.lpstrDeviceType="mpegvideo";
mciOpenParms.lpstrElementName=fileName;
dwError=mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE ¦MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&mciOpenParms);
if(!dwError)
return FALSE;
m_MCIDeviceID=mciOpenParms.wDeviceID;
mciPlayParms.dwFrom=0;
dwError=mciSendCommand(m_MCIDeviceID,MCI_PLAY,MCI_FROM ¦MCI_NOTIFY,(DWORD)(LPVOID)&mciPlayParms);
if(!dwError)
return FALSE;
return TRUE;
}
bool CSound::playBackGroundMusicSound(CString,CString)
{
playTippingMusicSound("sound/cxf.mp3","mp3");
// sndPlaySound("d:sound\hh.mp3",SND_ASYNC ¦SND_LOOP);
return true;
}
写在一个类中吧,定义对象调用就可以了
::MessageBeep(0xFFFFFFFF);
可以实现提示音
MessageBeep()
山寨MessageBox啊?
mp3太大了,用midi就可以了。
我自己建了一个像MessageBox一样的对话框,现在我想要不同情况下替换不同的图标。
比如警告是感叹号,询问的时候是问号,请问应该怎么做呢?
你可以重载一个带参数的构造函数,然后初始化的时候根据这个参数贴图实现
弱弱的问一句,贴图是那个函数哦? 呵呵- -
MssageBox本来挺好用的,干吗要替换
具体参数不同,表现的图标也不一样撒,呵呵
不过自动动手好,能力提高快,哪像我这么懒得,一般都用现成的
对话框上放个static text,往里面插入图片就可以了,至于怎么实现,很多书上都有的,去找找吧
呵呵,因为一些特殊的需要,麻烦啊!~~
好的,我去找找看~
[指定][位置][创建]关于在指定位置创建DIBSection的问题
08月 31st, 2008 by admin
Posted in VC/MFC | No Comments »
hdraw=DrawDibOpen();
CBitmap bmp;
bmp.LoadBitmap(IDB_MYBITMAP);
bmp.GetBitmap(&bm);
BITMAPINFOHEADER RGB32BITSBITMAPINFO=
{sizeof(BITMAPINFOHEADER),bm.bmWidth,bm.bmHeight,
1,32,BI_RGB,0,0,0,0};
HDC memdc=CreateCompatibleDC(NULL);
m_srcbmp=CreateDIBSection(memdc,(BITMAPINFO*)&RGB32BITSBITMAPINFO,
DIB_RGB_COLORS,(VOID**)&m_colsrc,NULL,0);
m_dstbmp=CreateDIBSection(memdc,(BITMAPINFO*)&RGB32BITSBITMAPINFO,
DIB_RGB_COLORS,(VOID**)&m_coldst,NULL,0);
if(m_srcbmp&&m_dstbmp)
{
HBITMAP hOldBmp=(HBITMAP)SelectObject(memdc,m_srcbmp);
HDC hDC=CreateCompatibleDC(memdc);
if(hDC)
{
HBITMAP hOldBmp2=(HBITMAP)SelectObject(hDC,bmp);
//将IDB_MYBITMAP的数据复制到pcol中
BitBlt(memdc,0,0,bm.bmWidth,bm.bmHeight,hDC,
0,0,SRCCOPY);
SelectObject(memdc,m_dstbmp);
SelectObject(hDC,hOldBmp2);
DeleteDC(hDC);
}SelectObject(memdc,hOldBmp);
}
上面是我在网上找到的一段代码。。。大概就是创建了一个DIBSection然后在里面显示图像。
但是第一次用DIBSection,实在没有发现在什么地方修改这个DIBSection的位置。。。
所以问问,能不能修改,或者添加什么代码可以修改。。。
谢谢各位大人了。。。。
[我用][动态][创建]我用SDK动态创建了一个Button,如何响应单击事件
08月 27th, 2008 by admin
Posted in VC/MFC | No Comments »
是用SDK动态创建的Button,不是用MFC的Cbutton类
哪位知道?
(最好有代码)
谢谢!
谢谢!
那要是要响应多个按钮的单击事件呢?
我建了2个,但都发送的BN_CLICKED消息,怎么区分,以便响应各自不同的事件呢?
每个按钮都有一个ID,就是你创建按钮的hMenu参数。WM_COMMAND消息的参数里含有这个ID。
我把hMenu参数设为整数,为什么错误提示说:不能转换?
我的代码是这样写的:
CreateWindowW(TEXT("BUTTON"),TEXT("caption"),WS_CHILD ¦ BS_PUSHBUTTON ¦ WS_VISIBLE ,50,100,200,30,hWnd,NULL,NULL,NULL);
刚刚发错了,我的代码是:
CreateWindowW(TEXT("BUTTON"),TEXT("caption"),WS_CHILD ¦ BS_PUSHBUTTON ¦ WS_VISIBLE ,50,100,200,30,hWnd,3000,NULL,NULL);
(int)12345
汗,写错。 (HMENU)12345
wParam高16位是BN_CLICKED,低16位是按钮ID。
用强制转换。
恩,行了!
谢谢!!!
CreateWindow("button","Click Here",WS_CHILD ¦ WS_VISIBLE ¦ BS_PUSHBUTTON,0, 0, 50, 30,hwnd,(HMENU) 1,((LPCREATESTRUCT) lParam)->hInstance, NULL);
创建一个PushButton,hwnd是当前窗口的句柄,其他都不用变