我在WM_CREATE消息处理程序的窗口中创建了几个控件,我想允许使用tab键将焦点从一个控件提升到下一个控件.
控件创建如下:
case WM_CREATE:
{
CreateWindowA("button", "Refresh Listview",
BS_MULTILINE | WS_CHILD | WS_VISIBLE, 10, 10, 70, 50,
hwnd, (HMENU)IDC_REFRESHLW, g_hInst, NULL);
break;
}
Run Code Online (Sandbox Code Playgroud)
当我按Tab键将焦点更改为窗口中的另一个控件时,它什么都不做.我必须以某种方式初始化它吗?
我注意到如果我使用对话框,它已经自动允许使用tab键,Tab键顺序是在.rc文件中创建控件的顺序.
但我不想要对话!
我正在使用带有win32窗口的同步套接字,并使用send()和recv()函数通过Internet TCP发送数据;
我想知道的是,我将如何在tcp套接字上发送一些整数甚至我自己的类/结构?因为send()函数只允许我发送字符.
我只需要发送字符然后将它们转换为带有atoi()的整数吗?或者如果我想发送一个类结构,我会发送许多字符串,然后将它们放在变量中.一个接一个.
我已经使用代码:: blocks编写了一些来自Mingw的代码到visual studio及其编译器,它已经发现了很多错误,我的数组大小必须是常量!为什么VS需要一个恒定的大小而mingw不需要?
例如
const int len = (strlen(szPath)-20);
char szModiPath[len];
Run Code Online (Sandbox Code Playgroud)
len变量用红色下划线表示它是一个错误并说"预期的常量表达式"
我能想到解决这个问题的唯一方法是....
char* szModiPath = new char[len];
delete[] szModiPath;
Run Code Online (Sandbox Code Playgroud)
我是否必须将所有内容更改为动态或VS中还有其他方式吗?
通常我使用视觉工作室,但我切换到mingw,我喜欢使我的应用程序可以从unicode和多字节轻松更改,在我的mingw项目中我有我的定义,包括这样:
#define WIN32_LEAN_AND_MEAN
#define WINVER 0x0700
#define _UNICODE
#include <windows.h>
#include <commctrl.h>
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
#define WND_MAIN_CLASS _T("MainWindowFrame")
Run Code Online (Sandbox Code Playgroud)
然后我注册并创建我的窗口,例如
WNDCLASSEX wc;
...
wc.lpszClassName = WND_MAIN_CLASS;
RegisterClassEx(&wc);
hwnd = CreateWindowEx(0, WND_MAIN_CLASS, _T("Main Window"),
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, NULL, NULL, hInst, NULL);
Run Code Online (Sandbox Code Playgroud)
但是当我去编译时,我得到错误,它无法将Wchar_t转换为WNDCLASSEX上的CHAR*和类名称和窗口标题上的CreateWindowEx上的CHAR*.
如果我右键单击并转到createwindowex和WNDCLASSEX的声明,它会从winuser.h中得到这些:
typedef WNDCLASSEXW WNDCLASSEX,*LPWNDCLASSEX,*PWNDCLASSEX;
#define CreateWindowEx CreateWindowExW
Run Code Online (Sandbox Code Playgroud)
如果我注释掉定义_UNICODE它编译并且没有任何问题
这可能看起来很奇怪,但是我的一个程序中有一个问题,我有一个A类,里面需要一个B类变量,而B类需要一个指向其中A类的指针,以便我可以确定哪个类附在什么......
我得到错误,因为在A类中它表示B类尚未定义,而在B类中它表示A类尚未定义......
我的两个包含单独类的头文件互相包含,我试图转发声明我的类,例如A类; B级; 但我得到编译器错误,如:
error C2079: 'CFrame::menu' uses undefined class 'CMenu'
Run Code Online (Sandbox Code Playgroud)
我需要一个指向B类中A类的指针,因为我想稍后将它传递给另一个类.
我在我的一个标题中有一些简短的定义,如下所示:
#define ROUND_DOWN(a,b) (a)-(a)%(b)
Run Code Online (Sandbox Code Playgroud)
例如
ROUND_DOWN(178,32) = 160
Run Code Online (Sandbox Code Playgroud)
但是,如果我把它传递给它:
ROUND_DOWN(160*2, 32);
Run Code Online (Sandbox Code Playgroud)
然后它像这样编译?
(160*2)-(160*2)%(32),
Run Code Online (Sandbox Code Playgroud)
这只是处理160*2两次..
我想知道内联函数是否以相同的方式运行?例如
inline int RoundDown(int a, int b)
{
return (a)-(a)%(b)
}
Run Code Online (Sandbox Code Playgroud)
将160*2作为320存储在"int a"中,然后计算会起作用,还是它的行为与定义相同?
一个更好的例子是:
RoundDown((x+x2)*zoom, tile_width);
Run Code Online (Sandbox Code Playgroud) 我以为我可以使用LVITEM结构LPARAM将指针附加到我的类,但我似乎无法让它工作!
这是我的代码的主要部分:
创建列表视图:
hlvQuiz = CreateChild(WC_LISTVIEW, "",
WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | LVS_ICON | LVS_AUTOARRANGE,
0, 0, 320, 240, m_hwnd, FontNormal);
Run Code Online (Sandbox Code Playgroud)
添加项目:
if (vQuizes.size() > 0)
{
LVITEM lvi;
lvi.mask = LVIF_TEXT | LVIF_PARAM;
lvi.iItem = 0;
lvi.iSubItem = 0;
lvi.cchTextMax = QUIZSTRLEN;
for (unsigned int i = 0; i < vQuizes.size(); i++)
{
lvi.lParam = (LPARAM)&vQuizes[i]; // adding pointer to lparam
lvi.pszText = vQuizes[i].szName;
ListView_InsertItem(hlvQuiz, &lvi);
}
}
Run Code Online (Sandbox Code Playgroud)
后来当我从LPARAM回来上课时:
LVITEM lvi;
lvi.iItem = ListView_GetNextItem(hwnd, -1, LVNI_SELECTED); …Run Code Online (Sandbox Code Playgroud) struct MyRect
{
int x, y, cx, cy;
char name[100];
};
int main()
{
MyRect mr;
mr.x = 100;
mr.y = 150;
mr.cx = 600;
mr.cy = 50;
strcpy(mr.name, "Rectangle1");
MyRect* ptr;
{
unsigned char bytes[256];
memcpy(bytes, &mr, 256);
ptr = (MyRect*)bytes;
}
printf("X = %d\nY = %d\nCX = %d\nCY = %d\nNAME = %s\n",
ptr->x, ptr->y, ptr->cx, ptr->cy, ptr->name);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我只是在测试如何将一个struct /类放在一个字节数组中,并且在编译和工作时很惊讶,printf打印出我在mr变量中设置的所有值.
只是有点困惑到什么"ptr"指向?它在某处为ptr分配了内存吗?
例如,如果我有大量的数据条目存储在一个文件中,每个都有不同的大小,我有1000个条目,使文件像100MB大,如果我然后想删除文件中间的条目,大小为50KB,如何删除文件中空的50KB字节而不移动所有结束字节来填充它?
我正在使用诸如此类的winapi函数进行文件管理:
CreateFile,WriteFile,ReadFile和SetFilePointerEx
可能重复:
C/C++检查是否设置了一个位,即int变量
例如,如果我有一个整数,我想检查20-25位的值是什么,或者我只是想检查其中一个位是0还是1,我该怎么做?
我有一个文件保存为UTF-8,我正在读这样的:
ReadFile(hFile, pContents, pFile->nFileSize, &dwRead, NULL);
Run Code Online (Sandbox Code Playgroud)
(pContents是大小为nFileSize的BYTE*)
它只是一个100字节左右的小文件,包含我希望以wchar_t*格式读入内存的文本,因此我可以使用unicode文本设置编辑和静态控件的文本.
如何将字节转换为UTF-8?
编辑(我不想使用fstream或wfstream)