我是C++的新手,在C++中发现了一个特殊的功能.我看到一个空的大小是1个字节,我做了一些研究,发现这是完成的,因为每个对象必须有一个不同的地址.但是我想知道放置的那个1字节的内容是什么.我知道它不会持有"this"指针,但它是一个虚拟字节还是实际上有一些内容?
我是Windows API编程的新手,我想用外行的术语知道什么是子类和API挂钩.我正在做一个使用所有者绘制控件的项目,我有两个术语不断出现.现在我已经在CodeProject.com上看到了很多关于这些主题的详细教程,但问题是所有这些都使用MFC,我在纯Win32编码.如果有人知道上述主题的任何好的教程,那么请发布链接.还试着避免链接到msdn,因为新手我无法弄清楚那里写的是什么.
我正面临一个非常奇怪的问题。任何人都可以告诉我以下代码有什么问题-:
#include <Windows.h>
LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM, LPARAM);
char szWinName[]="MyWin";
int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst,
LPSTR lpszArgs, int nWinMode)
{
HWND hwnd;
MSG msg;
WNDCLASSEX wndclass;
wndclass.cbSize=sizeof(WNDCLASSEX);
wndclass.hInstance=hThisInst;
wndclass.lpszClassName=szWinName;
wndclass.lpfnWndProc=WindowFunc;
wndclass.style=0;
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION)
wndclass.hIconSm=NULL;
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.lpszMenuName=NULL;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hbrBackground=(HBRUSH) GetStockObject(LTGRAY_BRUSH);
if(!RegisterClassEx(&wndclass)) return 0;
hwnd=CreateWindow(
szWinName,
"Hello World",
WS_OVERLAPPED,
CW_USEDEFAULT,
CW_USEDEFAULT,
500,
500,
NULL,
NULL,
hThisInst,
NULL
);
ShowWindow(hwnd, nWinMode);
UpdateWindow(hwnd);
while(GetMessage(&msg, NULL, 0, 0)>0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WindowFunc(HWND hwnd, UINT message, WPARAM wparam, …Run Code Online (Sandbox Code Playgroud) 大家好,我是Visual C++中Win32 API编程的新手.我使用的是Microsoft Visual Studio 2008专业版.我对指针有点困惑.请注意,虽然我可能是Windows编程的新手,但我不是C或C++的新手因此我理解指针的概念.导致问题的指针与对话框中的日期和时间选择器控件有关.现在根据msdn文档,日期和时间选择器使用WM_NOTIFY消息与应用程序通信,消息中的LPARAM将是指向NMHDR结构的指针.即 - : '日期和时间选择器(DTP)控件在收到用户输入或进程并对回调字段作出反应时发送通知代码.控件的父节点以WM_NOTIFY消息的形式接收这些通知代码.
现在,我可以通过在收到WM_NOTIFY消息时将LPARAM强制转换为NMHDR指针来访问NMHDR结构.这如下 - :
case WM_NOTIFY:
if ((((NMHDR*)lparam)->idFrom == IDC_DATETIMEPICKER)&&
((NMHDR*)lparam)->code == DTN_DATETIMECHANGE)
{ LPNMDATETIMECHANGE lpChange=(LPNMDATETIMECHANGE)lparam;
DisplayTime(&(lpChange->st));
MessageBox(NULL,"wm_notify","test",MB_OK);
}
return TRUE;
Run Code Online (Sandbox Code Playgroud)
但是看看这段代码片段的第四行.我正在将相同的lparam(我刚刚将其转换为NMHDR结构)转换为NMDATETIMECHANGE结构.
我的问题是这怎么可能?我如何将一个参数投射到引用两个不同结构的两个不同指针中?NMHDR和LPNMDATETIMECHANGE结构是根本不同的结构.你可以在这里查看 - :NMHDR和NMDATETIMECHANGE
这怎么可能?我知道可以将指针的值存储在具有不同数据类型的其他变量中,并在我们想要使用它时再次将其转换回来.但是如何让一个指针指向两个不同的结构呢?我的意思是我不认为NMHDR和NMDATETIMECHANGE结构在内存中是同一个实体,所以单个指针如何同时引用它们?我希望他们有两个不同的内存地址?哦,请注意,此代码已经过测试,有效.我的源代码如下:
#include <Windows.h>
#include <CommCtrl.h>
#include <cstdio>
#include "resource.h"
#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM, LPARAM);
BOOL CALLBACK DialogFunc(HWND, UINT, WPARAM, LPARAM);
VOID InitOptions(HWND);
VOID DisplayTime(SYSTEMTIME*); …Run Code Online (Sandbox Code Playgroud) 将2d数组传递给函数时遇到问题.看看代码 - :
#include<stdio.h>
void display(int (*arr)[3],int i,int j,int length,int breadth) {
for(;i<length;i++){
for(;j<breadth;j++){
printf("%d ",arr[i][j]);
}
printf("\n");
}
}
void main() {
int arr[3][3]={{1,2,3},{4,5,6},{7,8,9}};
display(arr,0,0,3,3);
}
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,我只能打印出2D数组的第一行.但是当不使用形式参数中的i和j而是将它们声明为display()函数中的局部变量时,一切正常.为什么我不能直接使用传递给函数的本地值?我在Visual Studio 2013中使用Visual C++命令行编译器.