小编Kai*_*ije的帖子

如何使用不是对话框的win32窗口使Tab键按下

我在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文件中创建控件的顺序.

但我不想要对话!

c c++ winapi

4
推荐指数
1
解决办法
2990
查看次数

C++套接字 - 我只能发送字符吗?

我正在使用带有win32窗口的同步套接字,并使用send()和recv()函数通过Internet TCP发送数据;

我想知道的是,我将如何在tcp套接字上发送一些整数甚至我自己的类/结构?因为send()函数只允许我发送字符.

我只需要发送字符然后将它们转换为带有atoi()的整数吗?或者如果我想发送一个类结构,我会发送许多字符串,然后将它们放在变量中.一个接一个.

c++ sockets winapi

4
推荐指数
1
解决办法
9785
查看次数

为什么VS要求数组大小不变,而MinGW不需要?它有办法吗?

我已经使用代码:: 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中还有其他方式吗?

c++ mingw visual-studio

4
推荐指数
2
解决办法
757
查看次数

#define _UNICODE无法使用MinGW + CodeBlocks

通常我使用视觉工作室,但我切换到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它编译并且没有任何问题

unicode winapi mingw codeblocks

4
推荐指数
1
解决办法
5354
查看次数

B类中的A类变量和A类中B类的指针?

这可能看起来很奇怪,但是我的一个程序中有一个问题,我有一个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类的指针,因为我想稍后将它传递给另一个类.

c++ visual-studio

3
推荐指数
1
解决办法
198
查看次数

"#define"和内联行为是否相同?

我在我的一个标题中有一些简短的定义,如下所示:

#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)

c c++ inline-functions c-preprocessor

3
推荐指数
2
解决办法
426
查看次数

如何将userdata附加到列表视图中的每个项目?C++ Win32

我以为我可以使用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)

c++ api winapi

2
推荐指数
1
解决办法
2217
查看次数

这是如何运作的?将任何东西复制到一个字节数组(字符)

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分配了内存吗?

c c++ memory

2
推荐指数
1
解决办法
168
查看次数

删除文件中间的字节而不移动结尾?

例如,如果我有大量的数据条目存储在一个文件中,每个都有不同的大小,我有1000个条目,使文件像100MB大,如果我然后想删除文件中间的条目,大小为50KB,如何删除文件中空的50KB字节而不移动所有结束字节来填充它?

我正在使用诸如此类的winapi函数进行文件管理:

CreateFile,WriteFile,ReadFileSetFilePointerEx

c c++ file-io winapi file-manipulation

2
推荐指数
1
解决办法
1746
查看次数

如何在C++中检查变量的某些位?

可能重复:
C/C++检查是否设置了一个位,即int变量

例如,如果我有一个整数,我想检查20-25位的值是什么,或者我只是想检查其中一个位是0还是1,我该怎么做?

c c++

0
推荐指数
1
解决办法
6228
查看次数

将字节数组转换为UTF-8 unicode

我有一个文件保存为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)

c c++ unicode winapi utf-8

0
推荐指数
1
解决办法
5661
查看次数